为什么这些变量不在全球范围内?

时间:2012-09-17 21:49:02

标签: javascript scope global-variables

我正在学习JavaScript,它的范围,命名空间和全局变量(以及如何不使用它们)。

我在下面有一个完整的例子来说明我的问题。我构建了一个命名空间“命名”JavascriptLearning,然后将一个Customer函数添加到命名空间。它按预期工作,JavascriptLearning对象/命名空间被添加到全局对象,并且Customer函数被添加到此命名空间。

在此之后,我创建了四个变量。 我很困惑为什么这四个变量 appName test cust1 notNewInstance 不在我认为他们会加入全球范围。

(我发现他们没有被添加到全局命名空间,通过在Chrome中调试并在执行结束时在警报调用时查看“this”对象。)

<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>

3 个答案:

答案 0 :(得分:1)

在JavaScript中设置全局变量时,它会自动添加到窗口对象中。 Chrome最有可能将“this”作为窗口对象引用。

http://snook.ca/archives/javascript/global_variable/

答案 1 :(得分:0)

JavaScript没有适当的命名空间。当使用术语namespace时,JavaScript被错误地使用,可能会引用分配给变量引用的作用域。此时JavaScript只有函数范围,但在不久的将来它也会有块范围。

通过将单个全局变量分配给对象文字或函数,可以避免污染全局范围。对象文本中的所有内容都将是一个属性,其中函数内的任何内容都需要使用var关键字作用域。在您的顶级函数中,使用"use strict"; pragma来检查未声明的引用,否则它将成为隐含的​​(偶然的)全局变量。

答案 2 :(得分: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;

然后闭包获得对函数生命周期剩余部分的所有变量的引用。