为什么`this`没有指向窗口对象?

时间:2013-05-06 14:29:20

标签: javascript

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

(function () {

    "use strict";

    console.log(this) // undefined

    // more stuff

}());

3 个答案:

答案 0 :(得分:7)

在ECMAScript 5的严格模式 only 中,当this的值未定义或为null时(即不在对象范围内或this显式设置时),{ {1}}不会从函数作用域返回全局对象。

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

  

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);