ES6新特性 JS 箭头函数 普通函数 this指向问题

普通函数的this

普通函数的 this 就是调用对象

	    let x = 111;
        let obj  = {
            x: 222,
            f() {
                console.log(this);
            }
        };
        obj.f();

        /*
            {x: 222, f: ƒ}
        */

如上面这个例子,obj 调用了 f(),所以 f() 打印的 this 是 obj

箭头函数的this

箭头函数没有自己的 this,那么他指向谁呢?是他定义所在的外层函数。

        let x = 111;
        let obj  = {
            x: 222,
            f() {
                let j = {
                    x: 222,
                    show: () => {
                        console.log(this);
                    }
                };
                j.show();
            }
        };
        obj.f();

        /*
            {x: 222, f: ƒ}
        */

如上面这个例子,找一下 show() 的外层函数,发现是 f(),而 f() 指向的 this 是 obj,所以打印出来是 obj

        let x = 111;
        let obj  = {
            x: 222,
            show: () => {
                console.log(this);
            }
        };
        obj.show();

        /*
            window
        */

再看上面这个例子,因为外层函数是不存在的,故指向 window,所以打印出来是 window

因为以上原因,所以不建议在json对象里面写箭头函数,建议在里面用普通函数。

输出哪个 x?

        let x = 111;
        let obj  = {
            x: 222,
            show() {
                console.log(x);
            }
        };
        obj.show();

        /*
            111
        */

如上,输出的是 obj 外层的 x 111,为什么呢?因为 obj 的 x,是 obj.x,不是 x,所以得这么写:

        let x = 111;
        let obj  = {
            x: 222,
            show() {
                console.log(this.x);
            }
        };
        obj.show();

        /*
            222
        */

这个 this 指向 obj,所以 this.x 就是 obj.x,即 222
如果里面的普通函数换成箭头函数,就出大事了。

        let x = 111;
        let obj  = {
            x: 222,
            show:() => {
                console.log(this.x);
            }
        };
        obj.show();

        /*
            undefined
        */

因为此时的箭头函数 show 的 this 指向 window,而 window 里面并没有 x,所以是 undefined,当然,如果把 let 声明的 x,换成 var,也是可以输出的,但是 ES6 新特性让咱们用 let,咱们就不要再思蜀了。

谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值