我正在学习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>
答案 0 :(得分:1)
在JavaScript中设置全局变量时,它会自动添加到窗口对象中。 Chrome最有可能将“this”作为窗口对象引用。
答案 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;
然后闭包获得对函数生命周期剩余部分的所有变量的引用。