# 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

如果我们直接调用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

在来一个虽然简单,但是很有代表性的题目

function f() {
    var user = '123';
    console.log(this.user); //undefined
    console.log(this); //window
}
f();
1
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

还是可以理解成 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

# 闭包(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
最近更新: 9/22/2022, 5:59:36 AM