Rumah  >  Soal Jawab  >  teks badan

javascript - isu berkaitan fungsi tanpa nama js

(function(){
    var obj, sayHi;

    obj = {};
    
    sayHi = function(str){
        console.log(str);
    }
    
    obj.sayHello = function(str1){
        sayHi(str1);
    }
    
    obj.sayYo = function(str2){
        console.log(str2);
    }
    
    window.obj = obj;
    
})()
    
    obj.sayHello("hello world!");     // hello world!
    obj.sayYo("yo, what's up?");      // yo, what's up?

Masalah kecil yang saya hadapi sendiri, saya tidak tahu sama ada anda mempunyainya Saya suka menulis fungsi tanpa nama baru-baru ini Apabila saya mula-mula melihat ini, saya lazimnya melihatnya ke belakang dan berfikir bahawa ia hanya mendedahkan obj dilaksanakan? Bilakah boleh melaksanakan sayHi?
Saya fikir saya pernah melihat mekanisme operasi js sebelum ini.
Saya tidak tahu sama ada perkara ini berlaku:
js harus dihurai terlebih dahulu semasa berjalan
Jadi sebelum melaksanakan sayHello, sayHello dalam fungsi tanpa nama sepatutnya menjadi

    obj.sayHello = function(str1){
        function(str1){
            console.log(str1);
            };
        };

Saya bukan seorang profesional, jadi saya tidak tahu sama ada ini cara yang betul untuk memahaminya?

怪我咯怪我咯2684 hari yang lalu948

membalas semua(2)saya akan balas

  • 怪我咯

    怪我咯2017-07-05 10:52:25

    Ini adalah isu skop.
    Hanya ingat bahawa fungsi telah menyimpan skop apabila ia dibuat Tidak kira di mana anda memanggilnya nanti, hasilnya akan sama seperti kod anda, jika anda menukarnya kepada ini, hasilnya akan tetap sama (. demi analisis mudah di bawah, berikan ini dengan segera Panggil fungsi dan beri nama, panggil ia ujian):

    (function test(){
        var obj, sayHi;
    
        obj = {};
        
        sayHi = function(str){
            console.log(str);
        }
        
        obj.sayHello = function(str1){
            sayHi(str1);
        }
        
        obj.sayYo = function(str2){
            console.log(str2);
        }
        
        window.obj = obj;
        
    })()
        var sayHi = function(str) { // 就算在全局作用域里面加个sayHi函数,也不会对sayHello有任何影响
            console.log("Hi");
        }
        obj.sayHello("hello world!");     // hello world!
        obj.sayYo("yo, what's up?");      // yo, what's up?

    Analisis, apabila fungsi obj.sayHello dicipta, ia akan menyimpan semua skop semasa:

    sayHello.[[scope]] = [
        sayHelloContext.AO,
        testContext.VO,
        globalContext.VO
    ]
    

    Pada masa ini adalah jelas bahawa fungsi sayHi berada dalam skop ujian, jadi rujukan ini disimpan secara langsung dalam sayHello Walaupun ia dijalankan dalam skop global, sayHi yang ditakrifkan semula dalam skop global masih tidak boleh menjejaskannya, kerana. ia adalah dari Carian ujian dalam fungsi, anda akan faham jika anda melihat contoh berikut:

    var x = 10;
     
    function foo() {
      alert(x);
    }
     
    (function () {
      var x = 20;
      foo(); // 10
    })();

    Skop fungsi foo ialah foo sendiri + skop global, jadi walaupun ia dilaksanakan dalam fungsi pelaksanaan segera, nilai output tidak akan menjadi 20, tetapi hanya 10

    balas
    0
  • 怪我咯

    怪我咯2017-07-05 10:52:25

    Ini bukan pemahaman yang baik, ini sepatutnya konsep penutupan. http://www.ruanyifeng.com/blo...

    Apabila mengakses pembolehubah dalam fungsi, semak dahulu sama ada fungsi itu mengisytiharkan pembolehubah tersebut Jika tidak, pergi ke skop luar untuk mencarinya sayHi, jadi saya memanggilnya secara langsung Jika sayHi tidak diisytiharkan pada masa ini, teruskan mencarinya di lapisan luar fungsi Jika saya menemui keadaan keseluruhan secara langsung, ia masih tidak wujud. Lepas tu takde lagi

    balas
    0
  • Batalbalas