Rumah > Soal Jawab > teks badan
Saya mempunyai banyak kekeliruan tentang situasi di mana nilai lalai parameter fungsi ialah fungsi
Sebagai contoh
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func());
}
bar(); //outer
Menurut pengenalan Ruan Yifeng kepada ES6, saya tahu bahawa jika parameter fungsi adalah nilai lalai, akan ada skop peringkat blok yang membungkus parameter terlebih dahulu, dan skop peringkat blok akan hilang selepas pemulaan selesai
Sebaik sahaja nilai lalai parameter ditetapkan, parameter akan membentuk skop (konteks) berasingan apabila fungsi diisytiharkan dan dimulakan. Apabila permulaan selesai, skop ini akan hilang. Tingkah laku tatabahasa ini tidak akan muncul apabila nilai lalai parameter tidak ditetapkan.
Saya boleh faham jika nilai lalai ialah pembolehubah biasa, tetapi saya masih tidak faham mengapa output di sini adalah luar dan bukannya dalam
曾经蜡笔没有小新2017-07-05 11:11:13
Satu ayat: Penutupan fungsi terbentuk apabila ia ditakrifkan, bukan apabila ia dijalankan.
给我你的怀抱2017-07-05 11:11:13
Kembangkan gula sintaksis dengan teliti dan anda sepatutnya dapat melihatnya dengan lebih jelas
let foo = 'outer';
function fk_compiler() {
return foo;
}
function bar(func) {
if (func === undefined) {
func = fk_compiler;
}
let foo = 'inner';
console.log(func());
}
bar();
Lihat, fk_compiler
里是不是只能返回外部作用域下的foo
?
習慣沉默2017-07-05 11:11:13
js ialah skop leksikal dan nilai foo mengambil nilai apabila fungsi ditakrifkan dan bukannya apabila ia dilaksanakan.
给我你的怀抱2017-07-05 11:11:13
Berdasarkan kod responden:
let foo = 'outer';
function fk_compiler() {
return foo;
}
function bar(func) {
if (func === undefined) {
func = fk_compiler;
}
let foo = 'inner';
console.log(func());
}
bar();
js mengamalkan skop leksikal, jadi tidak kira di mana fungsi itu dipanggil, atau dalam sebarang bentuk, skop leksikalnya hanya ditentukan oleh kedudukan apabila ia diisytiharkan.
fk_compiler
被声明的作用域在全局,所以,它会去访问全局作用域中的foo
. Jawapannya akan keluar.
Kod serupa:
function foo(){
console.log(this.a);
}
(function init(){
var a = 'inner';//此处改为 window.a = 'global';再试试
foo();
})();