今天看到這麼一道題:
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是固...