this指针变更,重新bind

这是一个面试题,

1 .    var Obj=function(msg){
2 .                  this.msg=msg;
3 .                  this.shout=function(){
4 .                               alert(this.msg);
5 .                   };
6 .                  this.waitAndShout=function(){
7 .                                setTimeout(this.shout,2000);
8 .                 };
9 .        }
10.        var aa=new Obj("abc");
11.        aa.waitAndShout(); //2s后undefined

按照上述代码的结果就是2秒后弹出alert,内容是”undefined”,而面试官的意思是怎么简单的让2秒后的alert弹出的内容为abc。
有网友给出如下解答,用that来指向原来的this,当然that不是什么js关键字,方法还是很实用的。

var Obj=function(msg){
                this.msg=msg;
                var that = this;
                this.shout=function(){
                              alert(that.msg);
                  };
                 this.waitAndShout=function(){
                              setTimeout(this.shout,2000);
                };
       }
       var aa=new Obj("abc");
       aa.waitAndShout(); //2s后

也有大神提出了别样的解决方案,只用改setTimeout那一句。

setTimeout(this.shout.bind(this),2000);

同时TA是这样回复的–此题关键在于: 将 this.shout 传给 setTimeout 后,shout 的 this 就不是 aa 而是 window 了,因此要用 bind 重新绑定。

发表评论

电子邮件地址不会被公开。 必填项已用*标注