06JavaScript作用域与对象
变量作用域
1 | // 声明全局变量 - 全局作用域 |
变量提升
1 | // 先调用后声明 |
以上代码会先输出undefined
然后输出100
。约等于以下写法
1 | var msg; |
所以变量提升也就是变量的声明被提升了
即使我们在定义这个函数之前调用它,函数仍然可以工作。这是因为在 JavaScript 中执行上下文的工作方式造成的。
JavaScript 仅提升声明,而不提升初始化。如果你先使用的变量,再声明并初始化它,变量的值将是 undefined
。变量提升也会在函数内产生,例如
1 | var msg = 100; |
因此我们可以得到结论:全局变量与局部变量同名时,在函数作用域中只能访问局部变量
函数提升
函数提升与变量提升较为类似。函数声明时 函数可以被正确被调用
1 | fn(); //输出 this is function |
如果表达式方式声明存在的函数提升是按照变量提升,因此函数不能被正确调用。
1 | fn(); |
变量与函数同名
函数声明方式时 函数提升比变量提升的优先级更高。
1 | console.log(fn); //打印函数fn:[Function: fn] |
创建对象
JavaScript
中只有一个复杂数据类型那就是object
,它既是一个函数也是一个构造函数。
创建对象有三种方式,分别为:
初始化器方式
创建一个非空对象
1
2
3
4
5
6
7var obj = {
name: "李磊",
age: "18",
sayMe: function () {
console.log("Hello World");
},
};创建一个空对象
1
var obj1 = {};
构造函数方式
创建一个非空对象
1
2
3
4
5var obj = new Object();
obj.name = "李雷";
obj.sayMe = function () {
console.log("this is lilei.");
};创建一个空对象
1
var obj2 = new Object();
Object.create()方式
创建一个非空对象
1
2
3
4
5var obj = Object.create(null);
obj.name = "李雷";
obj.sayMe = function () {
console.log("this is lilei.");
};创建一个空对象
1
var obj3 = Object.create(null);
为对象新增属性
1 | var car = {} |
检测对象属性
- 将属性值通过全等运算符与 undefined 进行比较
- 通过 if 语句来判断对象的属性是否存在
- 使用 in 运算符来判断对象的属性是否存在
- 使用
Object.hasOwnProperty()
方法来判断对象的属性是否存在
1 | var obj = { |
以上代码输出结果为:
与undefined比较
if判断
in运算符判断 false
hasOwnProperty判断 false
构造函数的基本用法
构造函数分为三种,不接受参数的构造函数、接受参数的构造函数与使用属性的构造函数。
不接受参数的构造函数
1
2
3
4
5
6
7
8function Hero() {
// 属性
this.name = "李雷";
// 方法
this.sayMe = function () {
console.log("this is lilei.");
};
}接受参数的构造函数
1
2
3
4
5
6
7
8function Hero(name) {
// 属性
this.name = name;
// 方法
this.sayMe = function () {
console.log("this is lilei.");
};
}使用属性的构造函数
1
2
3
4
5
6
7
8function Hero(name) {
// 属性
this.name = name;
// 方法
this.sayMe = function () {
console.log("this is " + this.name + ".");
};
}
在构造函数中的this
表示的是初始化的对象。例如声明一个Hero
类型的变量,调用是就可以看到编辑器提示的属性了。
1 | var hero = new Hero("lilei"); |
函数与构造函数整合在一起
简单来说就是为某个属性设置为函数。
1 | function Score() { |
因为setter
与getter
都被赋予了函数,因此被称为方法,调用时也自然要加上小括号了。
对象和函数整合在一起
简单来说就是将属性写在对象里,方法写在对象的return
里。
1 | function Score() { |
删除对象
删除对象使用delete
运算符,删除后再次访问则会显示undefined
1 | var user = { |
遍历对象
遍历对象毫无疑问用的是for-in
迭代。这样迭代过程中判断是否是方法可以使用instanceof
1 | var obj = { |