javascript - Mengenai penugasan semula fungsi itu sendiri dalam IIFE bernama?
ringa_lee
ringa_lee 2017-05-24 11:38:53
0
2
836
+function foo(){
foo=10;//我的问题代码
    console.log(foo);//方法自己
}();
console.log(typeof foo);//undefined 观察是否全局污染

Saya ingin bertanya ke mana perginya 10 yang ditetapkan semula kepada foo di dalam fungsi foo, dan bagaimana fungsi foo dengan nama yang sama menghalang pencemaran global Sila selesaikan dan kembangkannya

ringa_lee
ringa_lee

ringa_lee

membalas semua(2)
我想大声告诉你

Penyoal boleh bertanya ini, tidak mengapa. Namun, masalah ini boleh diselesaikan melalui amalan. . .

Pertama sekali, penyoal tidak mempunyai masalah dengan cara menulis IIFE Terdapat banyak cara untuk menulis IIFE Yang paling biasa ialah apa yang @ewind katakan dan:

.
(function(){}())

Ada juga yang jarang berlaku:

!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

Kemudian mari kita bercakap tentang kod:
Apabila memberikan nilai kepada nama fungsi semasa dalam fungsi: foo = 10; Tidak sah. (Saya bersetuju dengan @ewind, ia akan diabaikan di sini, perlu ada penjelasan yang lebih munasabah.) Penghurai JS akan mengabaikannya.
hasil yang saya laksanakan dalam konsol Chrome ialah:

function foo(){
    foo=10;//我的问题代码
    console.log(foo);//方法自己
}
undefined  // 上面typeof foo的结果

Ini membuktikan apa yang saya katakan di atasabaikan
Kemudian kerana IIFE mensimulasikan skop blok, persekitaran luaran tidak boleh mengakses pembolehubah dalaman. Jadi ia tidak ditentukan.


@ewind berkata demikian kerana foo ialah fungsi tanpa nama, jadi apa?
Jelas sekali konsepnya keliru. Fungsi foo bukan fungsi tanpa nama.

function [name]([param] [, param] [..., param]) { statements }

name
函数名,可以省略。当省略函数名的时候,该函数就成为了匿名函数。

MDN

迷茫

Pertama sekali, kod yang disiarkan tidak lengkap. Versi penuh sepatutnya seperti ini

(function foo(){
  foo = 10
  console.log(foo) // [Function: foo]
})();
console.log(typeof foo) // undefined

Ini nampaknya berlawanan dengan intuitif, kerana foo yang diisytiharkan tanpa var tidak mencemarkan skop global.

Tetapi jika nama pembolehubah yang diisytiharkan dalam fungsi itu bukan foo, ia sangat intuitif, seperti berikut:

var bar = 1;

(function foo(){
  bar = 10
})();

console.log(typeof foo) // undefined
console.log(bar) // 10

Jadi mengapa masalah berlaku apabila pembolehubah yang diisytiharkan dalam fungsi mempunyai nama yang sama dengan nama fungsi? Anda boleh lihat contoh ini:

(function foo(){
  console.log(foo) // [Function: foo]
  console.log(arguments.callee) // [Function: foo]
  console.log(foo === arguments.callee) // true
})();

Selepas fungsi yang dilaksanakan serta-merta mempunyai nama fungsi foo, arguments.callee semasa memanggil sebenarnya merujuk kepada foo. Membandingkan kedua-duanya, kita dapati bahawa foo ialah objek fungsi pada masa ini. Pada masa ini, operasi penugasan tidak akan berkuat kuasa Apabila menemui pembolehubah foo tanpa perisytiharan var, penterjemah juga akan mencari objek fungsi ini, sekali gus menghalang pencemaran dalam skop global.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan