这是一个面试题,

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 重新绑定。

随机文章

分享一个java做的五子棋
分享一个java做的五子棋

安装运行angular2
安装运行angular2

如何用IE9 固定你的网站至任务栏
如何用IE9 固定你的网站至任务栏

《 AngularJS深度剖析与最佳实践》安装front-jet失败
《 AngularJS深度剖析与最佳实践》安装front-jet失败

财猫省钱浏览器针对java异常hold住
财猫省钱浏览器针对java异常hold住

内容分享:道招
本文链接:this指针变更,重新bind
道招声明:除特别标注或作者不详外,本站所有文章均为原创,转载请注明。欢迎共同关注互联网!