我刚刚this在NodeJS环境中看到了关键字的奇怪行为.我用代码列出它们.我NodeJS v6.x用一个JavaScript文件运行这些代码.
在使用以下一行代码进行测试时,无论是否使用该'use strict'语句,都指向一个空对象{}.
console.log(this)
Run Code Online (Sandbox Code Playgroud)
但是,当我在自执行函数中运行语句时,
(function(){
console.log(this);
}());
Run Code Online (Sandbox Code Playgroud)
它正在打印一个非常大的对象.在我看来环境创建的全局执行上下文对象NodeJS.
在使用'use strict'语句执行上述功能时,预计会打印undefined
(function(){
'use strict';
console.log(this);
}());
Run Code Online (Sandbox Code Playgroud)
但是,在使用浏览器(我只测试过Chrome)时,前三个示例产生window对象,最后一个示例undefined按预期方式给出.
浏览器的行为是可以理解的.但是,如果是NodeJS,它不会创建执行上下文,直到我在函数内部包装?
那么,大多数代码NodeJS运行时都是空的全局 object?
在任何Web浏览器中,执行以下脚本将导致'wee'发送到控制台.在节点中它发送{}.
var d = 'wee';
console.log(this.d);
Run Code Online (Sandbox Code Playgroud)
我意识到Node this在这种情况下指的是exports对象.我知道global变量,这不是我想要访问的.此外,上面的脚本也没有d在全局对象上设置.它到底在哪里?我可以console.log(d);在上面的脚本中明确地访问它,但它似乎被隐藏在一些非标准空间中,完全没有任何理由.
我也意识到删除var意志会d在global对象上声明,这是预期的行为,尽管var在顶层范围内将其值存储在与"裸"变量不同的位置似乎很愚蠢.我的意思是,模块系统不应该是某种数字预防措施来防范全球污染吗?在这里打破模式似乎很容易,因此很难做出标准的事情.
d也未在module对象上声明.
我没有必要证明我为什么要问这个问题,但我会回答第一个问题,但是"你为什么要做什么?"
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);
Run Code Online (Sandbox Code Playgroud)
以我可以区分某些对象状态的方式d,我应该能够区分顶级范围的状态.在浏览器中,这是 …
我有一个如下所示的简单代码并将其作为节点模块执行:
\n\nconsole.log(this);\nmodule.exports = {\xe2\x80\xa6};\nRun Code Online (Sandbox Code Playgroud)\n\n我知道这global是默认上下文(就像window在浏览器中一样),但是this关键字指的是什么呢?