IIFE 中的“this”关键字上下文

Mar*_*ark 6 javascript

function foo() {
  console.log(this.a);
}

var a = 2;

(function() {
  "use strict";

  foo(); // 2
})();
Run Code Online (Sandbox Code Playgroud)

我只是想知道,怎么调用foo()仍然给出值 2?我认为因为fooIIFE内部被调用,然后this.a会评估为undefined,因为IIFE 中没有a变量。

Nic*_*ons 7

“严格使用”适用于 IIFE,而不是foo()函数。结果,foo在草率模式/非严格模式下运行。由于foo()没有明确this绑定到它,它默认为全局对象,在浏览器中是window. 当你声明var a在全球范围内,它就会被添加到窗口对象的属性,利用意义this.a的foo里面会给你持有的价值a,因为它是访问a的性能window

你会得到undefinedthis检查foo()是在严格模式,而不是IIFE正在运行:

function foo() {
  "use strict";
  console.log(this); // undefined
  console.log(this.a); // Crash
}

var a = 2;

(function() {
  foo(); 
})();
Run Code Online (Sandbox Code Playgroud)