我在 ie,firefox 和 node.js 中尝试过以下代码
var x = 10;
var o = { x: 15 };
function f(){
console.log(this.x);
}
f();
f.call(o);
浏览器中的结果是 10、15,但 node.js 中的结果是未定义的,15。
请向我解释一下“this”关键字在浏览器和 node.js 中的不同行为是什么?我已经阅读了很多页,但没有任何明显的答案。提前致谢。
我在 ie,firefox 和 node.js 中尝试过以下代码
var x = 10;
var o = { x: 15 };
function f(){
console.log(this.x);
}
f();
f.call(o);
浏览器中的结果是 10、15,但 node.js 中的结果是未定义的,15。
请向我解释一下“this”关键字在浏览器和 node.js 中的不同行为是什么?我已经阅读了很多页,但没有任何明显的答案。提前致谢。
在 Nodejs 中加载的 Javascript 文件会自动包装在匿名函数中。
所以在 Node 中你真正运行的是:
(function(/* There are args here, but they aren't important for this answer */){
var x = 10;
var o = { x: 15 };
function f(){
console.log(this.x);
}
f();
f.call(o);
})();
浏览器不这样做。问题是现在在 Nodex
中只是函数范围内的一个普通变量,它不是全局范围的一部分。当您f()
以这种方式调用时,this
withinf
是全局范围。
如果直接放在x
全局作用域上,这两种情况都可以。
this.x = 10;
这将放置x
在window
浏览器中的global
全局对象和 Node.js 中的全局对象上。
通常,您不会在 Node 中全局加载内容,而是将代码分组到模块中,如此处所述。您可以在此处访问有关各种全球事物的信息。如果您对包装器感到好奇,可以在这里查看。
在调用常规函数时f()
,严格模式与常规模式的行为不同。在常规模式下,this
将是全局对象(例如window
)。在严格模式下,this
将undefined
.
除了这种差异之外,this
函数调用中的分配完全在 javascript 标准中指定,因此如果您在不同情况下看到差异,则可能是由于strict
模式。将strict
模式添加到两种环境中,您应该会看到一致的行为。
您可以阅读此MDN 参考中的“保护 Javascript”部分以获取更多信息。