亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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搜了一下答案發現無關閉包,只是有關上下文,但不是特別明白,大神求帶?。。。∥易詈蟮慕鉀Q方法是在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 關注
  • 1289 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號