2012-07-10 71 views
0

我試圖清理編碼中一個長期存在的壞習慣:將小部件寫入全局範圍。對象不符合預期的範圍

我爲網頁上的新聞製作了一個很大的,大部分是自包含的腳本,並且在我將所有東西塞入一個函數之後它的工作效果令人驚喜,...事實上太好了。

爲了確保我沒有作弊,我寫了下面的代碼,以確保我的作用域是正確的:

var story_count = "THIS IS NOT A NUMBER"; 

console.log(story_count); 

touch_roll = function() 
{ 
    this.story_count = 0; 
} 

console.log(story_count); 

touch_roll(); 

console.log(story_count); 

滿以爲這產生控制檯

THIS IS NOT A NUMBER 
THIS IS NOT A NUMBER 
THIS IS NOT A NUMBER 

以下響應我完全驚訝地發現輸出實際上是這個

THIS IS NOT A NUMBER 
THIS IS NOT A NUMBER 
0 

this不是我認爲的是什麼?研究並沒有真正的幫助,但我有點被燒燬,所以我完全有可能讀錯了。如果不是這樣,那麼我如何將所有命名空間完全保留在該函數的範圍內,以免混淆網站上的現有位?


按以下馬特的答案,這裏是更正後的代碼:說

var story_count = "THIS IS NOT A NUMBER"; 

console.log(story_count); 

var touch_roll = new function() 
{ 
    this.story_count = 0; 
    console.log(story_count); 
} 

console.log(story_count); 

通過聲明touch_rollvar和實例功能new的Javascript評估功能爲對象運行時間(所以我們也可以刪除在底部的電話touch_roll())。

校正輸出如下:

THIS IS NOT A NUMBER 
0 
THIS IS NOT A NUMBER 

回答

4

因爲你不調用touch_rollnewthiswindow對象(這是在瀏覽器環境的全局變量屬於)。

如果你使用new,那麼你會得到:

THIS IS NOT A NUMBER 
THIS IS NOT A NUMBER 
THIS IS NOT A NUMBER 

此外,你聲明touch_roll作爲一個隱含的全局變量。請使用function declaration syntax,或將var添加到它。

+0

所以'var touch_roll = new function()'? – 2012-07-10 10:50:00

+0

工作奇蹟。謝謝!好的解釋也一樣。 – 2012-07-10 10:51:11

+0

@SandyGifford:應該訣竅! – Matt 2012-07-10 10:51:12

相關問題