在浏览器中,期望IIFE中的this
指向窗口对象。但是,在这种情况下,它是未定义的。
(function () {
"use strict";
console.log(this) // undefined
// more stuff
}());
答案 0 :(得分:7)
在ECMAScript 5的严格模式 only 中,当this
的值未定义或为null时(即不在对象范围内或this
显式设置时),{ {1}}不会从函数作用域返回全局对象。
调用函数时实际发生的情况如下:this
是调用ECMA-262时ThisBinding
值的行话。
10.4.3输入功能代码
当控件进入函数对象F中包含的函数代码的执行上下文,调用者提供thisArg和调用者提供的argumentsList时,执行以下步骤:
<强> 1。如果功能代码是严格代码,请将ThisBinding设置为thisArg。
的 2。否则,如果thisArg为null或未定义,则将ThisBinding设置为全局对象。
如果您需要全局对象,可以使用全局范围中定义的全局变量,或者使用围绕此的一些黑客,例如使用立即调用的this
1 。
1:使用new Function()
可以正常工作,因为它不会进入严格模式,除非该函数在new Function()
本身的主体内具有编译语'use strict';
( reference)。
答案 1 :(得分:3)
在严格模式下显式传递全局对象的一种方法是使用call(this)
(function(){
"use strict";
console.log(this) // this points to window
// more stuff
}).call(this);
答案 2 :(得分:3)
来自MDN,在“保护”JavaScript
下首先,在严格模式下传递给函数的值不是 盒装成一个物体。对于普通函数,这始终是一个对象: 如果使用对象值调用,则提供对象;价值, 盒装,如果使用布尔值,字符串或数字调用;或全球 如果使用undefined或null调用此对象。 (使用电话,申请或 绑定以指定特定的。)自动装箱是一种表现 成本,但在浏览器中暴露全局对象是一种安全隐患, 因为全局对象提供对“安全”功能的访问 JavaScript环境必须限制。因此对于严格的模式 函数,指定的这个使用不变:
示例:强>
"use strict";
function fun() { return this; }
assert(fun() === undefined);
assert(fun.call(2) === 2);
assert(fun.apply(null) === null);
assert(fun.call(undefined) === undefined);
assert(fun.bind(true)() === true);