js中箭头函数与普通函数的this的区别

43 阅读1分钟

综述:

普通函数的this,指向调用它的对象。

箭头函数的this,指向最近的一个this。(注意,只有全局作用域和函数里面才有this,所以,箭头函数的this,要么指向全局作用域,要么指向某一个函数)

接下来,我们通过几个例子,具体分析。

情况一

        var id = 'GLOBAL';  // 定义一个全局作用域的属性
        let obj = {
            id: 'OBJ',
            a: function () {
                console.log(this.id);
            },
            b: () => {
                console.log(this.id);
            }
        };

        obj.a();    // 'OBJ'
        obj.b();    // 'GLOBAL'

解释一下,普通函数中的this,指向调用它的对象,这个对象就是obj。箭头函数的this,在定义的时候确定,箭头函数外层没有函数,所以this指向全局作用域。

情况二

        var id = 'GLOBAL';  // 定义一个全局作用域的属性
        let obj = {
            id: 'OBJ',
            a: function () {
                console.log(this.id);
                const b = () => {
                    console.log(this.id);
                }
                b() // 'OBJ'
            },
        };

        obj.a();    // 'OBJ'

普通函数的this,依旧指向,obj。但是这个时候,箭头函数定义在一个函数内部,所以,箭头函数的this指向包裹它的函数,那么也指向obj。

文末彩蛋

不知道有没有细心的朋友,看到我在定义最外层那个id的时候,用的是var,如果用let,const会有什么不同呢?接下来,我通过几张截图,展示一下区别。

var id = 'GLOBAL';  // 定义一个全局作用域的属性

image.png 可以看到,用var定义的变量直接绑定在了全局作用域上。

let id = 'GLOBAL';

qqq.png 可以看到,用let定义的变量,会在作用域链上生成一个脚本作用域的概念。

所以,var与let,const在作用域上还是有明显区别的。