我正在学习这个关键字是如何工作的,我读到当一个函数被称为简单而简单,没有任何上下文对象或新关键字时,这个关键字只是指全局/窗口对象。但如果该功能使用严格模式,则此关键字设置为未定义。所以我写了这段代码来看看它是如何工作的:
function foo(){
"use strict";
alert(this.a);
}
var a = "Global A";
var obj = {
a : "Object's A",
foo : foo
}
setTimeout(obj.foo, 1000);
我以为我会收到一条错误,上面写着 Uncaught TypeError:无法读取属性' a'未定义的。但令我惊讶的是,输出全球A 。函数foo()以严格模式编写。但是,此关键字指的是全局对象。为什么输出全局A 而不是 TypeError ?
答案 0 :(得分:4)
这实际上取决于您使用的浏览器以及严格的实施方式。如果您正在使用完全实现严格模式的浏览器,则会看到错误。
来自this
但是,在严格模式下,它的值保持在输入执行上下文时设置的值,因此,在下面的例子中,这将默认为undefined:
function f2() {
'use strict'; // see strict mode
return this;
}
f2() === undefined; // true
因此,在严格模式下,如果执行上下文没有定义它,它仍然是未定义的。
注意: 在第二个示例中,这应该是未定义的,因为f2是直接调用的,而不是作为对象的方法或属性(e.g. window.f2()).
此功能当他们第一次开始支持严格模式时,在某些浏览器中没有实现。结果,他们错误地返回了窗口对象。
在我的浏览器中(最新的Chrome,我可以看到错误)
答案 1 :(得分:0)
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);
答案 2 :(得分:0)
参考MDN
<块引用>由 setTimeout() 执行的代码是从与调用 setTimeout 的函数分开的执行上下文中调用的。为被调用函数设置 this 关键字的通常规则适用,如果您没有在调用或绑定中设置 this,它将默认为窗口(或全局)对象。它不会与调用 setTimeout 的函数的 this 值相同。