cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Mengenai penugasan semula fungsi itu sendiri dalam IIFE bernama?

+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_leeringa_lee2775 hari yang lalu880

membalas semua(2)saya akan balas

  • 我想大声告诉你

    我想大声告诉你2017-05-24 11:40:53

    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

    balas
    0
  • 迷茫

    迷茫2017-05-24 11:40:53

    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.

    balas
    0
  • Batalbalas