IIFE中的“this”关键字上下文
function foo() {
console.log(this.a);
}
var a = 2;
(function() {
"use strict";
foo(); // 2
})();
回答
“严格使用”适用于 IIFE,而不是foo()函数。结果,foo在草率模式/非严格模式下运行。由于foo()没有明确this绑定到它,它默认为全局对象,在浏览器中是window. 当你声明var a在全球范围内,它就会被添加到窗口对象的属性,利用意义this.a的foo里面会给你持有的价值a,因为它是访问a的性能window。
你会得到undefined的this检查foo()是在严格模式,而不是IIFE正在运行:
function foo() {
"use strict";
console.log(this); // undefined
console.log(this.a); // Crash
}
var a = 2;
(function() {
foo();
})();