当我在流星包中写一个js文件时,我有以下代码:
A = 1;
console.log(A);
console.log(window.A);
我想知道为什么第一个console.log打印1但第二个打印未定义。
答案 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