【发布时间】:2013-12-27 06:24:05
【问题描述】:
流星文档(参见Namespacing 部分)说:
当你声明一个顶级变量时,你有一个选择。您可以设置变量 File Scope 或 Package Scope。
// File Scope. This variable will be visible only inside this
// one file. Other files in this app or package won't see it.
var alicePerson = {name: "alice"};
// Package Scope. This variable is visible to every file inside
// of this package or app. The difference is that 'var' is
// omitted.
bobPerson = {name: "bob"};
这真是太好了。如果一个包有多个源代码文件,则这些文件可以共享变量,但会将世界其他部分排除在外。但是我开始怀疑了。
他们到底是如何实现包范围的?
起初我以为他们是通过立即调用的函数表达式来实现的。你知道这样的结构:
(function() { /* your code here */ })();
所以我尝试在控制台中模拟这种行为。我定义了一个这样的变量:x = "Package scope candidate";。
我在控制台输入:
(function() {
x = "Package scope candidate";
})();
console.log(x);
我在控制台中得到"Package scope candidate"。多么令人失望。变量x 位于全局范围内。在Window 对象中。绝对不是我想要的。还有流星?他们以某种方式管理它。他们一定使用了一些我不懂的魔法。
【问题讨论】:
-
关于您的 iffy 以及为什么它没有按预期工作:未使用
var声明的每个变量都被自动假定为全局对象的属性。 -
@nietonfir 当然,这就是 Meteor 解析 JavaScript 以插入包范围变量的预声明的原因;见 Akshat 的回答。