2013-04-18 139 views
2

我來自C#Class(),fields,properties,namespace ... world。我剛剛將自己發佈到JavaScript。到目前爲止,我一直做得很好。然而,我的一位朋友正在查看我的代碼,並問我爲什麼要這樣做。什麼是JavaScript中的全局變量?

function Position (x, y) { 
    this.X = x; 
    this.Y = y; 
} 

朋友: 「你剛剛過rided位置......」 我: 「什麼位置?」 朋友:「可能是瀏覽器正在使用的任何東西。」 我:「我只運行這個腳本 - 它完美的工作」 朋友:「直到它不起作用。」

好吧所以...什麼?原來的位置是全球 ..但在哪裏和在什麼程度?我的朋友在整個瀏覽器中聽起來像是Global。所以我的問題是;

是一個JavaScript全局,整個瀏覽器的全球? >只有窗戶? >只有選項卡? >它走多遠?

回答

2

當JavaScript在瀏覽器中運行時,全局變量是window對象的屬性。因此,僅當前窗口是全局的,而不是其他瀏覽器窗口,選項卡,框架或iframe。每個人都有自己的window對象。

全球內置於JavaScript中沒有Position。您朋友的擔心可能是您網頁上包含的其他代碼也可能定義了相同的全局代碼。因此,其中一個定義(以後定義)將覆蓋另一個定義。

+1

每個'iframe'也有它自己的'window',並且不贊成使用'frame's。 –

+0

好極了!他讓我擔心。 – Bixel

+0

@FabrícioMatté - 謝謝!更新。 –

0

位置可以從瀏覽器窗口的任何地方訪問。用網絡術語來說,我相信瀏覽器窗口是您可以去的最高範圍。

你的朋友可能會說的是,如果某人已經定義了一個名爲Position的對象存在於全局作用域中,那麼你的代碼只是改變了這種行爲。通常,您將希望通過命名空間保護全局範圍與任何自定義方法。

4

這是當前窗口的全局。不要擔心其他標籤,窗口或iframe。話雖這麼說,我想他正試圖狀態是什麼在JavaScript即

不要弄亂全局命名空間

也就是說,不管你做全球性應該不會太大,它一個很好的原則應該是非常有意的。

JavaScript有函數作用域(不是塊作用域),所以一個簡單的方法來解決這個問題是把所有東西都包裝在一個立即調用的函數表達式中。

;(function() { 

    function Position (x, y){ 
      this.X = x; 
      this.Y = y; 
    } 

    // use Position here 

}()); 
+2

+1的對話中如何說話,我感到困惑,我會在這些行中發表一個答案(但懶惰':P')。另外,由於OP從JS開始,下面是一些幫助的參考鏈接:[Immediately-Invoked Function Expression(IIFE)](http://benalman.com/news/2010/11/immediately-invoked-function-expression /),[JavaScript模式模式:深入](http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html) –

+0

hrmm有趣..只是潛入jRequire - 並學習如何使「模塊」。 Position()被用來爲可繪製對象創建許多位置,如果我需要調整位置,我可以在一個易於閱讀的區域中聲明它們,我可以在那裏調整它,而不必在其他地方尋找它。 – Bixel