"use strict";
setTimeout(function() {"use strict";console.log(this)}, 1000);
setTimeout調用的'this'函數應該引用全局對象,但我也有'use strict';在身體裏。但它記錄窗口而不是未定義的,這正是我期待的。這裏發生了什麼事?爲什麼窗口仍然在這個嚴格的模式代碼中定義?
"use strict";
setTimeout(function() {"use strict";console.log(this)}, 1000);
setTimeout調用的'this'函數應該引用全局對象,但我也有'use strict';在身體裏。但它記錄窗口而不是未定義的,這正是我期待的。這裏發生了什麼事?爲什麼窗口仍然在這個嚴格的模式代碼中定義?
setTimeout
is defined作爲調用函數,它在window
的上下文中傳遞。
在其上實現的算法運行的量,方法的對象作爲該方法的上下文(一個窗口或WorkerGlobalScope對象),
它是類似於調用yourfunction.apply(window)
不yourfunction()
。
很好放!值得一提的是,NodeJS實現了一個稍微不同的定時器API,並且由於顯而易見的原因,它不會將'this'值設置爲窗口。它將「this」值設置爲超時對象本身(您在瀏覽器中調用clearTimeout,在瀏覽器中它只是一個數字,在Node中它是一個對象)。另外,正如答案中指出的那樣,當在web worker中運行時,出於明顯的安全原因,它不會被設置爲'window'對象,而是被設置爲worker全局作用域。 –
,因爲這實際上:
window.setTimeout(function() {"use strict";console.log(this)}, 1000);
你打電話的setTimeout和窗口對象實際上儘管你不寫它。
謝謝,但是這個回調函數裏面不應該還是undefined? –
好問題,我認爲上下文保持不變。因爲回調函數在setTimeout中被調用。 – Blauharley
@ZackGao不,不應該。檢查es5規範和DOM計時器API。 –
現在已經過了將近4年的時間了。
在MDN setTimeout page中有一個註釋,它正好解決了這個問題。
一個
setTimeout
回調的默認this
值將still
是window
對象,和不undefined
,即使在嚴格的模式。
這也適用於setInterval
,儘管沒有提及there。
你從哪裏瞭解該窗口沒有在嚴格模式下定義? – bingjie2680
我沒有。我瞭解到,指向全局對象的「this」是未定義的。 –
@ bingjie2680:這就是他所說的:http://jsfiddle.net/LfT3x/ –