编写流星包时的可变范围

时间:2014-04-15 08:10:11

标签: javascript scope meteor

当我在流星包中写一个js文件时,我有以下代码:

A = 1;
console.log(A);
console.log(window.A);

我想知道为什么第一个console.log打印1但第二个打印未定义。

2 个答案:

答案 0 :(得分:5)

这是因为bundler足够智能地解析您的包源代码,寻找全局变量。毕竟,包的(生成的)代码(即实际加载到浏览器的代码)之前的代码如下:

/* Package-scope variables */
var A;

应该解释一切;)

如果你真的想要将你的变量导出到你的包外面,就像@sbking告诉你的那样,所以在package.js写道:

// was Package.on_use in older Meteor versions
Package.onUse(function (api) {
  api.export('A');
});

修改

要记住的一件事是,当您将use strict语句放在文件的开头时,Meteor将不再检测隐式全局变量,除非它们使用api.export显式导出。因此,当您希望在包代码中包含私有全局变量时,这只会产生问题。

请注意,当严格模式处于活动状态并且这些变量未放入包"前导码"时,尝试将值赋值给未定义的变量将导致运行时错误,因此这实际上是一个交易破坏者。查看here以获取有关此问题的更多详细信息。

一个简单的解决方法是将所有私有全局变量放在一个文件中,开头没有use strict语句:

// globals.js
// no "use strict" statement here ...
MyPrivateVariable1 = null;
MyPrivateVariable2 = null;

答案 1 :(得分:2)

Meteor namespaces package variables.要导出包变量,您需要在api.export文件中使用package.js。请看这里的例子:

https://github.com/meteor/meteor/blob/devel/packages/email/package.js