包范围如何实现的?(How is package scope achieved?)

2019-10-19 03:48发布

流星文档(见命名空间 )说:

当你声明一个顶级变量,你有一个选择。 你可以把这些变量文件范围或包范围。

// 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对象。 绝对不是我想要的东西。 和流星? 他们管理它在某种程度上。 他们可能用一些神奇的,我不明白。

Answer 1:

看起来他们重新定义变量在该文件的顶部。

例如:

x = "Package scope candidate"

会成为

(function() {
    var x;
    (function() {
        x = "Package scope candidate";
    }).call(this);
}).call(this);

还有,以查找变量,并在顶部增加了他们,使他们成为作用域到文件,这反过来又反映了包范围的解释。

如果你看一下https://github.com/meteor/meteor/blob/devel/tools/linker.js你可以找到一些所谓的jsAnalyze看起来文件的全局变量在文件的顶部rescope左右。 该文件提供给客户端之前,它是像上面的方式重新包装。

该jsAnalyze包,这都看看https://github.com/meteor/meteor/blob/94c7833c82ac6ab62c36b4a39ee315199233aef9/packages/js-analyze/js_analyze.js

因此,全局提取及文件进行重构与全局,进口,出口,这是怎么了自身的命名空间了。



文章来源: How is package scope achieved?
标签: scope meteor