當您使用document.write()
加載文檔後,它會打開一個新文檔(清除前一個文檔)。看起來,在某些瀏覽器(例如IE)中,全局變量會立即被清除,即使是仍在運行的腳本也會被刪除,即document.write()
。這裏最好的答案是在頁面加載後不使用document.write()
。相反,使用DOM操作來更改現有文檔,但希望更改它而不是創建新文檔。如果使用DOM操作(操作innerHTML),而不是在this jsFiddle中使用document.write()
,則可以看到事情工作正常(基於最近的代碼示例)。
由於清除當前文檔幾乎從不是你想要做的,如果你能解釋你真正想要完成的事情,我們可以更好地解決問題。
如果您想在modify
已加載的現有文檔之後,您需要使用DOM操作功能,如.innerHTML
(用於更改節點的HTML)或DOM操作函數以將新節點添加到現有文檔中,而不是document.write()
。
您通常不應該使用this
來引用全局變量。全局變量不帶前綴(除非本地覆蓋)或可用前綴window
。
因此,任何一項都將工作:
<script type="text/javascript">
var x = 10;
window.onload = function() {
console.log(x);
console.log(x);
console.log(x);
}
</script>
<script type="text/javascript">
var x = 10;
window.onload = function() {
console.log(window.x);
console.log(window.x);
console.log(window.x);
}
</script>
至於你的問題有關使用this
。的this
值被設定的幾種方法之一:
- 當你調用一個方法,如
pleasures.makeIceCream()
的this
值將被設置爲在makeIceCream()
方法pleasures
對象的對象上。
- 當您在函數對象如
makeIceCream.call(pleasures)
上使用call
方法時,在調用makeIceCream()
方法時,this
的值將設置爲pleasures
對象。
- 當使用上功能對象
apply
方法等makeIceCream.apply(pleasures)
,那麼this
值將在這個調用中makeIceCream()
方法的設置爲pleasures
對象。
你可以閱讀更多有關這些MDN引用.call()
和.apply()
:
適用於:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply
電話:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
在所有其他時間的this
值一般不應因爲它沒有明確設置。它很可能被設置爲全局對象(在瀏覽器中,這是window
對象),但使用它來訪問全局變量並不被認爲是最佳實踐,也沒有任何理由。
*輸出「未定義」* - 實際上,它沒有。 http://jsfiddle.net/Tomalak/dt4dg/你正在做一些與你在這裏展示的不同的東西。 – Tomalak 2012-03-10 15:57:48
我只是使用innerHTML將其輸出到DOM元素,或者將其記錄到控制檯 – thescientist 2012-03-10 15:59:36
@Tomalak:我絕對是積極的,我寫的是我正在做的:)。我寫這段代碼的意圖是理解「這個」。如果我錯了,請指向正確的方向。謝謝。 – 2012-03-10 16:03:02