wai*_*kuo 4 javascript scope meteor
当我在写的流星包一个js文件,我有以下代码:
A = 1;
console.log(A);
console.log(window.A);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么第一个console.log打印1但第二个打印未定义.
发生这种情况是因为bundler它足够智能地解析您的包源代码以查找全局变量.毕竟,包的(生成的)代码(即实际加载到浏览器的代码)之前的代码如下:
/* Package-scope variables */
var A;
Run Code Online (Sandbox Code Playgroud)
这应该解释一切;)
如果你真的想要将你的变量导出到你的包之外,那就像@sbking告诉你的那样,所以package.js写:
// was Package.on_use in older Meteor versions
Package.onUse(function (api) {
api.export('A');
});
Run Code Online (Sandbox Code Playgroud)
要记住的一件事是,当您use strict在文件的开头放置语句时,Meteor将不再检测隐式全局变量,除非它们显式导出api.export.因此,当您希望在包代码中包含私有全局变量时,这只会产生问题.
请注意,当严格模式处于活动状态并且这些变量未放入包"preamble"时,尝试将值赋值给未定义的变量将导致运行时错误,因此这实际上是一个交易破坏者.请看这里关于这个问题的更多细节.
一个简单的解决方法是将所有私有全局变量放在一个文件中,use strict开头没有语句:
// globals.js
// no "use strict" statement here ...
MyPrivateVariable1 = null;
MyPrivateVariable2 = null;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1002 次 |
| 最近记录: |