javascript - isu berkaitan fungsi tanpa nama js
怪我咯
怪我咯 2017-07-05 10:50:25
0
2
920
(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?

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(2)
刘奇

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

刘奇

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!