函数执行上下文,浏览器与nodejs

时间:2018-03-28 17:52:48

标签: javascript node.js

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

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

在节点中,它将输出两次false。在浏览器中,它会输出两次,如我所料。

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

2 个答案:

答案 0 :(得分:5)

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

现在在nodejs中,窗口的等价为global。如果你运行this===global,你将在repl。

中成真

但是从档案来看,这不等于global global variable assignment in node from script vs command line

答案 1 :(得分:2)

这可能已经知道,但只是想添加@ Subin的答案,如果你明确地将函数绑定到相同的那个,它将返回true,无论是在脚本内还是REPL。

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

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