美文网首页
js中this问题小结

js中this问题小结

作者: 四月天__ | 来源:发表于2017-07-13 11:34 被阅读5次

    在使用js中的this时,由于js的语法规则,this的指向是会改变的,js中的this指向是根据函数在执行时的作用域而定的,而不是在函数定义时的作用域而定的,这就使我们在使用异步回调函数时由于this的指向发生改变而头疼不已,如下代码:
    示例一、同步函数:

    var  peopel = {
        name:'四月天',
        getName:function(){
            console.log(this.name)//此时this指向people对象。
        }
    }
    
    peopel.getName();//输出 "四月天"
    

    示例二、下面我们在运行一个异步执行的情况:

    var  peopel = {
        name:'四月天',
        getName:function(){
            setTimeout(function() {
                console.log(this.name);//此时this指向window对象。
            }, 1000);
        }
    }
    
    peopel.getName();//输出 undefined
    

    由于我们设置了在1秒之后再来执行上面函数,这时候 this已经指向了全局的window对象而不再是peopele对象了,因此输出 undefined。

    在ES5中为了解决this指向改变的问题,我们会采用绑定函数定义时的this来解决:
    示例三、ES5解决办法

    var  peopel = {
        name:'四月天',
        getName:function(){
            var _this = this;
            setTimeout(function() {
                console.log(_this.name)
            }, 1000);
        }
    }
    
    peopel.getName();//输出 "四月天"。得到我们期望的效果。
    

    在ES6中的箭头函数解决了我们上述的问题,让我们在使用this时不再担心this指向会改变。
    ES6中this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。这使得我们在箭头函数里面使用的this就是我们在定义函数时的this,正是因为它没有this,所以也就不能用作构造函数。

    我们对示例二的代码使用通过箭头函数进行优化:

    var  peopel = {
        name:'四月天',
        getName:function(){
            setTimeout(()=>{
                console.log(this.name);//使用箭头函数,this永远是定义函数时的this(这里指peopel);
            }, 1000);
        }
    }
    
    peopel.getName(); //输出 "四月天"。通过箭头函数我们没有通过临时变量来绑定this就得到我们期望的效果。
    

    箭头函数有几个使用注意点。

    (1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
    (2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
    (3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
    (4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

    上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。

    对this的理解其实就是在函数体内调用this的时候向上找一层,这个函数属于谁,this就指向谁。

    参考:一缕殇流化隐半边冰霜的揭开 this & that 之迷

    推荐:饿了么前端前端知乎专栏

    相关文章

      网友评论

          本文标题:js中this问题小结

          本文链接:https://www.haomeiwen.com/subject/fmhwhxtx.html