-1

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

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

在此之后,我创建了四个变量。 我很困惑为什么这四个变量appNametestcust1notNewInstance没有像我想的那样被添加到全局范围中。

(我发现它们没有被添加到全局命名空间中,方法是在 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>
4

3 回答 3

1

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

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

于 2012-09-17T21:51:58.593 回答
0

我在全局命名空间中看到了这些变量。你可能弄错了?

我可以为你的学习贡献一些有用的东西,在声明 var 时,你应该在当前函数的顶部声明它们。这在解释时自动发生,称为变量提升

这是可以证明的,例如,当您在声明的闭包中添加警报时,

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

然后闭包在函数生命周期的剩余时间内获得对所有变量的引用。

于 2012-09-17T22:10:18.727 回答
0

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

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

于 2012-09-17T21:57:42.223 回答