一尘不染

为什么在使用strict时未定义匿名函数中的“ this”?

javascript

在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做可能有意义,但是我找不到任何具体答案。

例:

(function () {
    "use strict";

    this.foo = "bar"; // *this* is undefined, why?
}());

阅读 312

收藏
2020-05-01

共1个答案

一尘不染

这是因为,在ECMAscript 262第5版之前,如果使用的人constructorpattern忘记使用该new关键字,那会造成很大的混乱。如果new在ES3中调用构造函数时忘了使用,请this引用全局对象(window在浏览器中),然后用变量破坏全局对象。

这是可怕的行为等人在ECMA决定,只是为了集thisundefined

例:

function myConstructor() {
    this.a = 'foo';
    this.b = 'bar';
}

myInstance     = new myConstructor(); // all cool, all fine. a and b were created in a new local object
myBadInstance  = myConstructor(); // oh my gosh, we just created a, and b on the window object

最后一行会在严格的ES5中引发错误

"TypeError: this is undefined"

(这是一个更好的行为)

2020-05-01