Pertanyaan Mengapa "ini" dalam fungsi anonim tidak terdefinisi ketika menggunakan ketat?


Kenapa ini dalam fungsi anonim tidak terdefinisi saat menggunakan javascript dalam mode ketat? Saya mengerti mengapa ini bisa masuk akal, tetapi saya tidak dapat menemukan jawaban konkret.

Contoh:

(function () {
    "use strict";

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

Uji dalam biola: http://jsfiddle.net/Pyr5g/1/ Lihat logger (firebug).


75
2018-03-22 12:45


asal


Jawaban:


Itu karena, sampai ECMAscript 262 edisi 5, ada kebingungan besar jika orang yang menggunakan constructor pattern, lupa untuk menggunakan new kata kunci. Jika Anda lupa menggunakannya new saat memanggil fungsi konstruktor di ES3, this direferensikan objek global (window di browser) dan Anda akan mengkritik objek global dengan variabel.

Itu perilaku yang buruk dan orang-orang di ECMA memutuskan, hanya untuk mengatur this untuk undefined.

Contoh:

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

Baris terakhir akan melemparkan kesalahan dalam ES5 yang ketat

"TypeError: this is undefined"

(yang merupakan perilaku yang jauh lebih baik)


86
2018-03-22 12:50



Ada mekanisme yang disebut "tinju" yang membungkus atau mengubah this objek sebelum memasuki konteks fungsi yang disebut. Dalam kasus Anda, nilai dari this seharusnya undefined karena Anda tidak memanggil fungsi sebagai metode objek. Jika mode tidak ketat, dalam hal ini, ini diganti oleh window obyek. Di strict mode itu selalu tidak berubah, itulah mengapa undefined sini.

Anda dapat menemukan informasi lebih lanjut di
https://developer.mozilla.org/en/JavaScript/Strict_mode


13
2018-03-22 13:00



Menurut Jawaban Stack Overflow ini, Kamu dapat memakai this di dalam fungsi anonim, cukup dengan menelepon .call(this) di ujungnya.

(function () {
    "use strict";

    this.foo = "bar";
}).call(this);

6
2018-02-13 12:58