Javascript 函数执行上下文、浏览器与节点

Javascript 函数执行上下文、浏览器与节点,javascript,node.js,Javascript,Node.js,以下函数在节点和浏览器中提供两种不同的结果: (function funfunfun(root, factory) { console.log(root === this); factory(root); })(this, function (root) { console.log(root === this); }); 在节点中,它将输出false两次。如我所料,在浏览器中,它将输出两次true 所以问题是。。。为什么?在浏览器中,在未绑定函数中,此将指向窗口对象。这

以下函数在节点和浏览器中提供两种不同的结果:

(function funfunfun(root, factory) {
    console.log(root === this);
    factory(root);
})(this, function (root) {
    console.log(root === this);
});
在节点中,它将输出false两次。如我所料,在浏览器中,它将输出两次true


所以问题是。。。为什么?

在浏览器中,在未绑定函数中,
将指向窗口对象。这就是为什么您在浏览器中得到两个“真”

现在在nodejs中,窗口的等价项是
global
。如果您运行
this===global
,您将在repl中得到true

但从文件来看,这不等于
全局


这可能已经知道了,但只想在@Subin的回答中添加一点,即如果将函数显式绑定到同一个This,则无论是在脚本内部还是在REPL中,它都将返回true

(function funfunfun(root, factory) {
    console.log(root === this);
    factory(root);
}).call(this, this, (function (root) {
    console.log(root === this);
}).bind(this, this));

此外,还提供了有关全局对象的良好信息。

有趣的是,在节点终端中运行函数,结果为true两次。但在保存到文件中时运行show false twiceDidn不要在节点终端中尝试。现在更奇怪的是:)你的答案是正确的,我不知道为什么有人投反对票<代码>仅仅是因为每个节点模块都包装在一个排序的IIFE中,所以默认情况下,您不在全局范围内。
我不知道为什么会投反对票(当然不是我:)。这意味着函数在不同的范围内执行,而不是从不同的范围执行?有趣。你每天都能学到新东西。