關於setTimeout函式中的閉包問題

2021-07-04 18:35:37 字數 962 閱讀 3325

今天看到這麼一道題:

function

dog(msg)

this.work=function

()

}var o=new dog("bones");

o.work(); //返回結果是undefined

下面我來解釋一下結果為什麼是undefined,為什麼沒有輸出預期的「bones」。

這是因為在執行完o.work()這行**時,this物件已經被釋放了,不再指向o了;然後經過2秒後,再執行this.eat函式時,此時的this指向全域性變數window,而在全域性空間並沒有eat函式,因而返回undefined。

那麼怎麼改**似的結果返回」bones」呢?這樣做:

function

dog(msg)

this.work=function

(),2000);

}

}var o=new dog("bones");

o.work(); //返回結果是"bones"

這裡用到了閉包的知識。

分析:

在執行到o.work時,用變數that保留了此時this的引用(即o),然後在settimeout中,寫了乙個匿名函式,在匿名函式內部引用了that,而that引用了o,造成o不會被釋放掉。這是閉包的知識。

然後2秒後,在執行settimeout內的匿名函式時,此時執行that.eat(),that可以通過作用域鏈找到最近一次對它定義的值,即上面所定義的對o的引用,故能取到o.msg的值,執行o.eat()返回」bones「。

JS中的setTimeout 函式

settimeout 方法用於在指定的毫秒數後呼叫函式或執行表示式。返回乙個 id 數字 可以將這個id傳遞給 cleartimeout 來取消執行。settimeout code,milliseconds,param1,param2,settimeout function,milliseconds...

js中關於setTimeOut()迴圈的問題

function stop function checktime i return i function fun2 week function starttime starttime 上面 執行起來是沒錯 若是這樣呢 while true 今天同學問到了這個為啥不能用迴圈呢,我給的解釋就是用迴圈沒有...

setTimeout非同步執行函式this丟失

var prop 100 function parent parent.prototype.get function parent.prototype.show function var child new parent child.show 2.使用es6中的箭頭函式,因為在箭頭函式中this是固...