为了账号安全,请及时绑定邮箱和手机立即绑定

js一道面试题。貌似闭包,上下文,函数调用,声明,setTimeout()

js一道面试题。貌似闭包,上下文,函数调用,声明,setTimeout()

Cats萌萌 2018-07-31 21:20:55
遇到这样一道题,一个函数内,有两个alert函数,第二次alert需要在第一次alert2000ms后调用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搜了一下答案发现无关闭包,只是有关上下文,但不是特别明白,大神求带!!!!我最后的解决方法是在34行间插入 var this.msg= msg; 在 10.11行插入 aa.shout();不知有没有更好的(优雅-。-)解决方法?抱歉刚刚没描述清楚,这道题的本意应该是调用aa.waitAndShout()呼出两个间隔两秒的alert**我想请教的是这道题要怎么改,才能达到这种效果最后或者是我理解错了?还是就是考察this指针的用法
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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

楼下好些人答得乱七八糟的,我再补充一下

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


查看完整回答
反对 回复 2018-08-06
?
喵喔喔

TA贡献1735条经验 获得超5个赞

var that = this;

是一个办法,但是不推荐,可读性不是特别好。

function () {}.bind(this);

比较推荐

最好用ES6的箭头函数,可以完美解决掉setTimeout里callback的这个问题

setTimeout(() => {waitAndShout(this.msg);});


查看完整回答
反对 回复 2018-08-06
  • 2 回答
  • 0 关注
  • 1238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信