在任何 Web 浏览器中执行以下脚本将导致'wee'
被发送到控制台。在 Node 中,它发送{}
.
var d = 'wee';
console.log(this.d);
我意识到this
在这种情况下,Node 指的是导出对象。我确实知道这个global
变量,这不是我想要访问的。此外,上面的脚本也没有设置d
在全局对象上。它到底去哪儿了?我可以在上面的脚本中显式访问它console.log(d);
,但它似乎完全没有充分的理由隐藏在一些非标准空间中。
我也意识到删除对象上的var
will 声明,这是预期的行为,尽管在顶级范围内将其值存储在与“裸”变量不同的位置似乎很愚蠢。我的意思是,模块系统的重点不应该是某种预防全球污染的数字预防措施吗?在这里,打破模式似乎很容易,而做一些标准的事情却很难。d
global
var
d
也没有在module
对象上声明。
我不必证明我为什么要问这个问题,但我会回答第一个巨魔,并附上“但是你为什么想做 taht hurr durrrr”。
var d = {};
d.bleep = 'y';
var a = Object.keys(d);
d.bloop = 'y';
d.blop = 'y';
var b = Object.keys(d);
// c = b - a;
var c = b.filter(function (item) {
if(a.indexOf(item) === -1) {
return true;
}
return false;
});
console.log(a,b,c);
就像我可以区分 的某些对象状态一样d
,我应该能够区分顶级范围的状态。在浏览器中,这是window
对象,this
在顶级范围中被引用。我应该能够在脚本执行之前和之后评估环境的属性以确定很多事情,其中之一是检查在任意脚本的顶级范围内声明的函数和变量,然后将它们应用于导出对象。这将使以编程方式为未编写为模块的脚本生成模块包装器变得容易,并且简单forEach
地应用于顶级函数和变量列表以分配whateverThisIs['varFunc']
给module.exports['varFunc']
...
和东西...
这种行为似乎类似于匿名函数。在匿名函数this
中可以引用window
对象,var
必须直接调用 s(因为它们在 anon func 的范围内),并且在没有var
关键字的情况下声明的泄漏变量可能会在window
对象处结束。我还没有阅读整个手册,也许这正是正在发生的事情,但是,我的印象是每个模块都在它自己的上下文(窗口)中执行,并且节点通过使用global
和在模块上下文之间传递消息module.exports
。 ..
我不知道。不过我想知道。如果你知道,请告诉我。