2012-09-15 126 views
9

我從大衛馬克閱讀下面的分析對JS框架「煎茶」的屬性有什麼區別:https://gist.github.com/3279190,並在那裏,他指出...有一個全局變量和全局對象

他們想要的是一個全局變量,但他們最終成爲了全局對象的一個​​屬性。根據規範和(和實施歷史),兩者之間有足夠的區別,需要注意不要混淆(如此處所述)。

...但據我知道有沒有var my_global = 123;之間的任何差別(在瀏覽器環境)window.my_global = 123;(在例子中,我認爲環境是一個瀏覽器 - 因此使用window,但我可以用this.my_global來代替,因爲當在不同的環境中運行時,全局對象顯然不同)。

但是忽略這個小的差異是爲全局對象分配一個屬性和創建一個全局變量有區別嗎?我認爲不是,創建一個全局變量只是將屬性賦值給全局對象的另一種方法。

我相信如果他們有一個ID爲「my_global」的元素,那麼顯然可能會導致JavaScript引用正確的問題,但在某些瀏覽器中可能會出現問題,但我不確定該如何/是什麼原因問題(例如,爲全局對象分配一個屬性是否會導致元素ID問題發生,還是聲明導致元素ID問題的全局變量?)

有人可以爲我澄清一下嗎?

回答

8

變量在全球範圍內使用var並創建全局對象的屬性創建。但是,此屬性與尚未使用var創建的全局對象的屬性具有不同的行爲。

首先,有一個變量聲明是如何執行的區別:在執行任何代碼之前在全球範圍var聲明創建全局對象的屬性,通常被稱爲吊裝,以及周圍記載的效果網頁(見下面的參考資料)。其次,與使用delete運算符(雖然這是not true in older versions of IE)未用var創建的全局對象的屬性不同,全局變量不能被刪除。 delete不能用於刪除變量。這種差異歸結爲每個對象屬性都具有的內部property attributes。這些屬性在ECMAScript規範中指定。 ECMAScript中5個方面,var foo = "bar"創建與[[Configurable]]全局對象的屬性foo屬性falsethis.foo = "bar"(在全球範圍內)創建一個foo屬性與屬性[[Configurable]]true

參考文獻:

+0

非常感謝您的回答。我有種想法,當用'var'來聲明vs不是,但不知道'[[Configurable]]'屬性。 – Loktar

+0

我見過的最棒的答案之一。認真。 –

-2
var count = 123 

var global_object = { 
    count:var = 456 
console.log(this.count) //returns 456 

} 

console.log(count) //returns 123 

console.log(global_object) //returns 456 

以上,count首先被定義爲一個全局變量。然後,它被定義爲全局對象內的一個屬性。全局對象內的定義對於該對象是局部的。

我現在看到我的答案出現了問題,這在我第一次發佈時並未出現在我的面前。在上面最上面的答案中,我注意到它正確地表明,在定義中使用問題「var」中的全局​​變量的情況下,但在全局對象的情況下,不使用「var」。我仍然期望範圍在這裏發揮作用(它會在ActionScript中)。

我有一些其他問題與上面的例子。 count:var =對我來說是錯誤的。也許這應該是var count = 456。我仍然期望在函數內聲明的變量只在該函數中具有作用域。因此,示例中的console.log表達式應該是真實的。

+0

不要以爲這是OP的內容? – m90

+0

'window'是一個全局對象。 'window.count === count // true' – Shea

0

我沒有意識到任何實際的區別,但確實有一些區別參考全局或作爲window.var。一個簡單的例子:

 
'use_strict'; 
console.info(window.foo); 
console.info(foo); 

window.foo將簡單地返回undefined。 foo會給出未定義的錯誤。 所以是的,他們是不同的。但在良好的代碼(我的例子是非常糟糕的代碼),它看起來沒有任何區別。 (但如果有,我真的想多瞭解一下:))