在浏览器中,在全局范围内运行,this
总是window
在你的例子中
var obj1;
var obj2;
function x() {
obj1 = this; // window
}
function y() {
obj2 = this; // window
}
x();
y();
console.log(obj1 === obj2); // window === window = true
console.log(obj1 === this); // window === window = true
这不是它在 Node 中的工作方式。在 Node.js 中,所有模块(脚本文件)都在自己的中执行closure https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures而浏览器直接在全局范围内执行所有脚本文件。
换句话说,在 Node 中运行的几乎任何文件中,this
将只是一个空对象,因为 Node 将代码包装在立即调用的匿名函数中,并且您可以使用以下命令访问该上下文中的全局范围GLOBAL
反而。
这一点在文中也有提到全局文档 http://nodejs.org/api/globals.html#globals_global_objects:
其中一些对象实际上并不在全局范围内,而是在模块范围内 - 这将被注意到。
但是,当在 Node.js 中调用没有特定上下文的函数时,通常会默认为全局对象- 相同GLOBAL http://nodejs.org/api/globals.html#globals_global前面提到过,因为它是执行上下文。
所以在函数之外,this
是一个空对象,因为代码被 Node 包装在函数中,为每个模块(脚本文件)创建自己的执行上下文,而在函数内部,因为它们是called没有指定的执行上下文,this
是节点GLOBAL
object
在 Node.js 中你会得到
var obj1;
var obj2;
function x() {
obj1 = this; // GLOBAL
}
function y() {
obj2 = this; // GLOBAL
}
x();
y();
console.log(obj1 === obj2); // GLOBAL === GLOBAL = true
console.log(obj1 === this); // GLOBAL === {} = false
最后一个在哪里this
确实是一个空对象,如上所述
为了完整起见,值得注意的是,在严格模式下,您会在浏览器中得到相同的结果(true, false
) 与 Node 中一样,但那是因为变量与 Node 中的变量正好相反
"use strict"
var obj1;
var obj2;
function x() {
obj1 = this; // undefined
}
function y() {
obj2 = this; // undefined
}
x();
y();
console.log(obj1 === obj2); // undefined === undefined = true
console.log(obj1 === this); // undefined === window = false
这是因为传递的值是this
严格模式下的函数不会被强制成为对象(也称为“装箱”)。
对于非严格模式下的普通函数,this
始终是一个对象,并且它始终是全局对象,如果called与undefined
or null
this-value,即没有特定的执行上下文。
不仅是自动拳击 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Securing_JavaScript性能成本,但在浏览器中公开全局对象会带来安全隐患,因为全局对象提供对以下功能的访问:"secure"JavaScript 环境必须受到限制。
因此,对于严格模式函数,指定this
没有装箱到对象中,如果未指定,this
将undefined
内部函数,如上所示,但是this
仍然是全局范围内的窗口。
同样的事情发生在 Node.js 的严格模式下,其中this
函数内部不再是GLOBAL
but undefined
, and this
函数外部仍然是相同的空对象,最终结果仍然是true, false
,但值this
Node.js 中的严格模式也会有所不同。