2012-09-17 122 views
-1

我正在學習JavaScript,其範圍,名稱空間和全局變量(以及如何不使用它們)。爲什麼這些變量不在全球範圍內?

我有一個完整的例子,說明我的問題。我構建了一個名爲「JavascriptLearning」的名稱空間,然後將一個Customer函數添加到名稱空間。它按預期工作,將JavascriptLearning對象/名稱空間添加到全局對象,並將Customer函數添加到此名稱空間。

之後,我創建了四個變量。 我爲什麼這四個變量APPNAME測試cust1notNewInstance沒有被添加到全球範圍,因爲我認爲他們會感到困惑。

(我發現,他們並沒有受到Chrome的調試,並在隨後結束執行觀看「這個」對象,在警告呼叫加入到全局命名空間。)

<html> 
<head> 
    <script> 
     var JavascriptLearning = window.JavascriptLearning || {}; 

     // Pass in the namespace 
     (function(nameSpace) { 
      // Uppercased because we are using this function as a "class". 
      nameSpace.Customer = function Customer(name, company) { 
       // Using this, we create a new object and add properties to it. Puts an object dynamically with a "shape" 
       this.name = name; 
       this.company = company; 

       // Without a return keyword, the return value would be undefined 
       return 0; 
      } 
     })(JavascriptLearning); 
     var appName = "Hello"; 
     var test = function TEST() { return; } 

     // Assigning the new keyword is used to return an object as defined in the function. 
     var cust1 = new JavascriptLearning.Customer("Matt", "Company"); 

     // Not using the new keyword simply uses the return value of the function 
     var notNewInstance = JavascriptLearning.Customer("Test", "Company"); 
     this.alert(cust1.name + " " + cust1.company); 
    </script> 
</head> 
    <body> 

    </body> 
</html> 
+0

werks4me,我在Chrome 21中獲得了「Matt Company」。 – ken

+0

@ken腳本運行成功,我問爲什麼我沒有在全局範圍內看到我的一些變量 – contactmatt

+1

我看到全局範圍內的變量Chrome調試器...你確定你看到你認爲你在看什麼嗎? –

回答

0

JavaScript沒有正確的命名空間。當術語namespace與JavaScript一起使用時被錯誤地使用以引用分配給變量引用的範圍。這時JavaScript只有函數範圍,儘管在不久的將來它也會有塊範圍。

您可以通過將單個全局變量分配給對象字面量或函數來避免污染全局範圍。對象字面值內的所有東西都將是一個屬性,其中函數內的任何內容都需要使用var關鍵字進行限定。在頂層函數中,使用"use strict";編譯指示來檢查未聲明的引用,否則這些引用將隱含(意外)全局變量。

0

我在全局命名空間中看到了這些變量。你可能會誤解?

我可以爲你的學習貢獻一些有用的東西,當聲明變量時,你應該在當前函數的頂部聲明它們。這在解釋時自動發生,被稱爲variable hoisting

這是顯而易見的,例如,當你在你宣佈關閉添加提醒,

(function(nameSpace) { 
    nameSpace.Customer = function Customer(name, company) { 
    this.name = name; 
    this.company = company; 
    alert(appName); 

    return 0; 
    } 
})(JavascriptLearning); 

程序上閱讀的代碼,你會認爲是未定義,但是發生了什麼事是這樣的,

var JavascriptLearning = window.JavascriptLearning || {}; 
var var appName, test, cust1, notNewInstance; 

然後封閉獲得對函數生命期的其餘部分的所有變量的引用。

相關問題