在浏览器中,期望this
在 IIFE 中指向窗口对象。但是,在这种情况下它是未定义的。
(function () {
"use strict";
console.log(this) // undefined
// more stuff
}());
在浏览器中,期望this
在 IIFE 中指向窗口对象。但是,在这种情况下它是未定义的。
(function () {
"use strict";
console.log(this) // undefined
// more stuff
}());
仅在 ECMAScript 5 的严格模式下,当 的值为this
undefined 或 null 时(即不在对象范围内或this
显式设置时),this
将不会从函数范围返回全局对象。
调用函数时实际发生的情况如下 - 调用时ThisBinding
的值是行话this
(ECMA-262)。
10.4.3 输入功能码
当控制进入函数对象 F 中包含的函数代码的执行上下文、调用者提供 thisArg 和调用者提供 argumentsList 时,将执行以下步骤:
1.如果功能码是严格码,设置ThisBinding为thisArg。
2. 否则,如果 thisArg 为 null 或未定义,则将 ThisBinding 设置为全局对象。
如果你想要全局对象,你可以使用在全局范围内定义的全局变量,或者使用一些技巧来解决这个问题,例如使用立即调用的new Function()
1。
1: usingnew Function()
有效,因为它不会进入严格模式,除非函数'use strict';
在自身的主体内具有编译指示new Function()
(参考)。
在严格模式下显式传递全局对象的一种方法是使用call(this)
(function(){
"use strict";
console.log(this) // this points to window
// more stuff
}).call(this);
来自MDN,在“保护”JavaScript 下
首先,作为 this 传递给严格模式下的函数的值不会被装箱到对象中。对于普通函数,this 始终是一个对象:如果使用对象值 this 调用提供的对象;如果使用布尔值、字符串或数字调用此值,则被装箱;如果使用未定义或 null this 调用,则为全局对象。(使用 call、apply 或 bind 来指定特定的 this。)自动装箱是一种性能成本,但在浏览器中公开全局对象是一种安全隐患,因为全局对象提供了对“安全”JavaScript 环境必须限制的功能的访问。因此,对于严格模式函数,指定的 this 使用不变:
例子:
"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);