严格模式下“ this”关键字的默认绑定

Ani*_*mar 4 javascript this

我正在学习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

Sur*_*tta 5

这实际上取决于您使用的浏览器以及实施的严格程度。如果您使用的浏览器完美地实现了严格模式,则会看到该错误。

来自的文档 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/


brk*_*brk 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);
Run Code Online (Sandbox Code Playgroud)