"此"的默认绑定严格模式下的关键字

时间:2018-02-28 06:25:12

标签: javascript this

我正在学习这个关键字是如何工作的,我读到当一个函数被称为简单而简单,没有任何上下文对象或新关键字时,这个关键字只是指全局/窗口对象。但如果该功能使用严格模式,则关键字设置为未定义。所以我写了这段代码来看看它是如何工作的:

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

3 个答案:

答案 0 :(得分:4)

这实际上取决于您使用的浏览器以及严格的实施方式。如果您正在使用完全实现严格模式的浏览器,则会看到错误。

来自this

的文档
  

但是,在严格模式下,它的值保持在输入执行上下文时设置的值,因此,在下面的例子中,这将默认为undefined:

function f2() {
  'use strict'; // see strict mode
  return this;
}

f2() === undefined; // true

因此,在严格模式下,如果执行上下文没有定义它,它仍然是未定义的。

注意: 在第二个示例中,这应该是未定义的,因为f2是直接调用的,而不是作为对象的方法或属性(e.g. window.f2()). 此功能当他们第一次开始支持严格模式时,在某些浏览器中没有实现。结果,他们错误地返回了窗口对象。

在我的浏览器中(最新的Chrome,我可以看到错误)

enter image description here

https://jsfiddle.net/1mp0hq03/1/

答案 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 值相同。