(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?
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):
Analisis, apabila fungsi obj.sayHello dicipta, ia akan menyimpan semua skop semasa:
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:
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