# JavaScript易错点
# This指向
TIP
JS 初学者总是对 this 关键字感到困惑,因为与其他现代编程语言相比,JS 中的这this关键字有点棘手。 “this” 一般是表示当前所在的对象,但是事情并没有像它应该的那样发生。JS中的this关键字由函数的调用者决定,谁调用就this就指向哪个。如果找不到调用者,this将指向windows对象。
# 普通函数
第一个例子很简单。 调用test对象中的func(),因此func()中的'this'指向的是test对象,所以打印的prop是test中的prop,即42。
var test = {
prop: 42,
func: function() {
return this.prop;
},
};
console.log(test.func()); // 42
1
2
3
4
5
6
7
2
3
4
5
6
7
如果我们直接调用getFullname函数,第二个例子将打印出'111',因为此时this找不到调用者,所以默认就为window对象,打印的fullname即是全局的。
var fullname = '111'
var obj = {
fullname: '222',
prop: {
fullname: '333',
getFullname: function() {
return this.fullname;
}
}
}
var test = obj.prop.getFullname
console.log(test()) // in browser is '111',in node is undefined
console.log(obj.prop.getFullname()) // '333'
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
在来一个虽然简单,但是很有代表性的题目
function f() {
var user = '123';
console.log(this.user); //undefined
console.log(this); //window
}
f();
1
2
3
4
5
6
2
3
4
5
6
这里f 的调用等同于 window.f()
; 所以f函数内部this指向的是window
注意不能只看上级对象,更关键的是直接调用对象
var obj = {
user: "xxx",
b: {
user: "bbb",
fn: function() {
console.log(this.user); // undefined
}
}
}
var run = obj.b.fn;
run()
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
还是可以理解成 window.run()
# 箭头函数
????
var test = {
prop: 42,
func: () => {
return this.prop;
},
};
var prop = 11;
console.log(test.func());
// in browser is 11 , in node is undefined
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 闭包(Closure)
闭包(Closure)是指有权访问另外一个函数作用域中的变量的函数。。
TIP
- 闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
- 闭包就是就是函数的“堆栈”在函数返回后并不释放,我们也可以理解为这些函数堆栈并不在栈上分配而是在堆上分配。
- 当在一个函数内定义另外一个函数就会产生闭包。
闭包是在另一个作用域内创建一个封闭的词法范围。它通常会自动返回来生成这个词法环境。这个环境由创建闭包时在作用域内的任何局部变量组成。它就像一个微型工厂,用这些原料生产出具有特定功能的产品。
function add(n) {
var num = n
return function addTo(x) {
return x + num
}
}
addTwo = add(2)
addTwo(5)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8