0

在浏览器中,期望this在 IIFE 中指向窗口对象。但是,在这种情况下它是未定义的。

(function () {

    "use strict";

    console.log(this) // undefined

    // more stuff

}());
4

3 回答 3

7

仅在 ECMAScript 5 的严格模式,当 的值为thisundefined 或 null 时(即不在对象范围内或this显式设置时),this将不会从函数范围返回全局对象。

调用函数时实际发生的情况如下 - 调用时ThisBinding的值是行话thisECMA-262)。

10.4.3 输入功能码

当控制进入函数对象 F 中包含的函数代码的执行上下文、调用者提供 thisArg 和调用者提供 argumentsList 时,将执行以下步骤:

1.如果功能码是严格码,设置ThisBinding为thisArg。
2. 否则,如果 thisArg 为 null 或未定义,则将 ThisBinding 设置为全局对象。

如果你想要全局对象,你可以使用在全局范围内定义的全局变量,或者使用一些技巧来解决这个问题,例如使用立即调用的new Function()1

1: usingnew Function()有效,因为它不会进入严格模式,除非函数'use strict';在自身的主体内具有编译指示new Function()参考)。

于 2013-05-06T14:35:59.137 回答
3

在严格模式下显式传递全局对象的一种方法是使用call(this)

(function(){

    "use strict";

    console.log(this) // this points to window

    // more stuff

}).call(this);
于 2013-05-06T14:40:01.683 回答
3

来自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);
于 2013-05-06T14:40:49.357 回答