我正在学习this关键字的工作原理,并读到,当一个函数被调用为简单明了,没有任何上下文对象或new关键字时,this关键字只是引用了global / window对象。但是,如果函数使用严格模式,则this关键字将设置为undefined。所以我写了这段代码来看看它是如何工作的:
function foo(){
"use strict";
alert(this.a);
}
var a = "Global A";
var obj = {
a : "Object's A",
foo : foo
}
setTimeout(obj.foo, 1000);
Run Code Online (Sandbox Code Playgroud)
我以为我会收到一条错误消息:Uncaught TypeError:无法读取undefined的属性“ a”。但让我吃惊,产量为全球一个。函数foo()以严格模式编写。但是,此关键字仍指向全局对象。为什么输出Global A而不是TypeError?
这实际上取决于您使用的浏览器以及实施的严格程度。如果您使用的浏览器完美地实现了严格模式,则会看到该错误。
来自的文档 this
但是,在严格模式下,此值将保持为进入执行上下文时设置的值,因此,在以下情况下,它将默认为未定义:
function f2() {
'use strict'; // see strict mode
return this;
}
f2() === undefined; // true
Run Code Online (Sandbox Code Playgroud)
因此,在严格模式下,如果执行上下文未定义它,则它将保持未定义状态。
注意: 在第二个示例中,这应该是未定义的,因为f2是直接调用的,而不是作为对象的方法或属性调用的(e.g. window.f2()). 。某些浏览器刚开始支持严格模式时并未实现此功能。结果,他们错误地返回了window对象。
在我的浏览器中(最新的Chrome浏览器,我可以看到该错误)
https://jsfiddle.net/1mp0hq03/1/
的上下文this取决于函数的调用方式。
该函数foo设置在a也定义的窗口对象上。a也是全局变量,因为它与var
function foo() {
"use strict";
console.log(window.foo) // will log the foo function
alert(this.a);
}
var a = "Global A";
var obj = {
a: "Object's A",
foo: foo
}
setTimeout(obj.foo, 1000);Run Code Online (Sandbox Code Playgroud)