在任何Web浏览器中执行以下脚本将导致'wee'
被发送到控制台。 在节点发送{}
var d = 'wee';
console.log(this.d);
我意识到,在节点this
指的是出口在这种情况下对象。 我不知道关于global
变量,这是不是我想要的访问。 另外,上面的脚本不设置d
全局对象在任。 到底在哪它去? 我可以通过显式访问它console.log(d);
在上述但脚本它似乎是在一些非标准的空间都卷走没有很好的理由。
我也意识到,去掉var
将宣布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就必须直接调用(因为他们是在不久FUNC的范围),并没有宣布泄露瓦尔var
关键字可能会在最终window
对象。 我还没有仔细通读手册,也许这到底是什么回事,但我认为每个模块中它自己的上下文(窗口)执行的印象,并且节点通过使用通过模块上下文之间的信息global
和module.exports
...
我不知道。 我想,虽然知道。 如果你知道,请告诉我。
所以每个节点模块被包装成一个函数体如所示在这里的节点的源代码
NativeModule.wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];
所以,如果你声明一个变量与var
,它在功能上本地的模块,基本上该模块私有变量。 这不是一个性质global
, module
, module.exports
,或this
。 如果你忘记了var
,它进入global
对象的属性。 如果你明确地创建一个属性this
,即进入exports
,并提供给其他模块。
这里有一个小程序,它是希望启发。
var aDeclaredVar = '*aDeclaredVar*';
undeclaredVar = '*undeclaredVar*';
this.aThisProperty = '*aThisProperty*';
module.aModuleProperty = '*aModuleProperty*';
module.exports.anExportProperty = '*anExportProperty*';
console.log('this', this);
console.log('this === exports', this === exports);
console.log('this === module', this === module);
console.log('this === module.exports', this === module.exports);
console.log('aDeclaredVar', aDeclaredVar);
console.log('undeclaredVar', undeclaredVar);
console.log('this.aThisProperty', this.aThisProperty);
console.log('module.aModuleProperty', module.aModuleProperty);
console.log('module.exports.anExportProperty', module.exports.anExportProperty);
console.log('global.undeclaredVar', global.undeclaredVar);
console.log('global.aDeclaredVar', global.aDeclaredVar);
而且它的输出:
this { aThisProperty: '*aThisProperty*',
anExportProperty: '*anExportProperty*' }
this === exports true
this === module false
this === module.exports true
aDeclaredVar *aDeclaredVar*
undeclaredVar *undeclaredVar*
this.aThisProperty *aThisProperty*
module.aModuleProperty *aModuleProperty*
module.exports.anExportProperty *anExportProperty*
global.undeclaredVar *undeclaredVar*
global.aDeclaredVar undefined