Rumah > Soal Jawab > teks badan
var x = 1;
function foo(x,y=function(){x=2;}){
var x = 3;
y();
console.log(x);
}
foo();
Kod ini muncul dalam buku es6 yang ditulis oleh cikgu Ruan Yifeng Hasil akhir ialah 3. Penerangan teks mengatakan bahawa x dalam y dan x dalam var x = 3 saya tidak faham di sini.
Kemudian keluarkan var var x= 3, dan anda boleh mengeluarkan 2, yang lebih sukar difahami. . . Semoga ada jawapan
女神的闺蜜爱上我2017-07-05 10:39:59
Ini sebenarnya melibatkan skop perantaraan yang diperkenalkan oleh parameter lalai ES6. Ruan Yifeng juga terlepas isu ini pada mulanya, tetapi sudah tentu ia betul di sini.
Tujuan skop perantaraan adalah untuk mengelakkan parameter lalai daripada dicemari oleh pembolehubah dalam fungsi. Tujuan asal parameter lalai adalah untuk membenarkan parameter mempunyai nilai lalai Jika pembolehubah di dalam fungsi boleh ditingkatkan, maka parameter lalai tidak bermakna. Lihat artikel untuk penjelasan dan contoh khusus.
Jadi melihat kembali soalan itu,
var x = 1;
function foo (x2, y = function () { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo();
Ada tiga skop di sini Tandakan x dari luar ke dalam:
var x1 = 1;
function foo (x2, y = function () { x2 = 2; console.log(x2); }) {
var x3 = 3;
y();
console.log(x3);
}
foo();
console.log(x1);
Jika tiada parameter x, maka tandanya ialah:
var x1 = 1;
function foo (y = function () { x1 = 2; console.log(x1); }) {
var x2 = 3;
y();
console.log(x2);
}
foo();
console.log(x1);
阿神2017-07-05 10:39:59
y() mengubah suai parameter x fungsi foo, bukan x global. (Di sini anda boleh console.log(x) selepas memanggil y() untuk mengetahui bahawa x global masih 1.)
Masalahnya mudah: 1) Apabila menggunakan var x = 3, console.log(x in foo ) mencetak pembolehubah tempatan x dalam foo, dan y() hanya mengubah suai parameter x, jadi output akhir ialah pembolehubah tempatan x = 3
2) Apabila var tidak digunakan, semua x dalam foo menunjuk kepada parameter x, dan y ialah digunakan () Tukar parameter x kepada 2, dan akhirnya keluarkan 2
PHP中文网2017-07-05 10:39:59
Nilai lalai
y mengubah x pembolehubah global
Alih keluar var var Pada masa ini ia telah diberikan nilai 2
天蓬老师2017-07-05 10:39:59
Ini adalah perbezaan antara kitaran hayat pembolehubah tempatan dan pembolehubah global var x = 3; Kedua-dua pembolehubah tempatan akan digunakan dalam badan kaedah tidak akan digunakan, jadi output adalah var x = 3 nilai x apabila anda mengeluarkan var var x = 3;, ini bermakna tiada pembolehubah tempatan lain yang ditakrifkan dalam kaedah, pembolehubah global Jadi, output ialah 2;
扔个三星炸死你2017-07-05 10:39:59
Pertama sekali, anda perlu memahami definisi operator var Pembolehubah yang ditakrifkan dengan operator var akan menjadi pembolehubah tempatan dalam skop di mana pembolehubah itu ditakrifkan, jika anda menggunakan var untuk mentakrifkan pembolehubah dalam fungsi, maka pembolehubah ini tergolong dalam fungsi Pembolehubah tempatan akan dimusnahkan apabila fungsi keluar, dan pembolehubah yang ditakrifkan secara langsung tanpa menggunakan var akan menjadi pembolehubah global.
Konsep lain yang perlu anda fahami ialah isu rantaian skop Apabila program mencari pembolehubah, ia akan mencari dalam skop semasa terlebih dahulu Jika ia tidak dijumpai, ia akan mencari ke atas di sepanjang rantai skop ditemui selepas melintasi, ia akan melaporkan tidak ditentukan.
Kembali kepada kod di atas, mula-mula gunakan var untuk mentakrifkan x=1 dalam skop global x tergolong dalam pembolehubah global, dan kemudian tentukan pembolehubah tempatan var x=3 di dalam fungsi foo; nilai kepada pembolehubah global x Pada masa ini, x menjadi 2. Ingat bahawa pembolehubah global x diubah suai pada masa ini dan bukan pembolehubah tempatan Nilai x dicari secara dalaman , jadi hasilnya ialah 3. Jika var var x=3 dialih keluar, x menjadi pembolehubah global Mengubah suai x sama seperti memberikan nilai kepada x dalam fungsi y Pada masa ini hanya terdapat satu pembolehubah global x. Mengikut susunan pelaksanaan kod, pembolehubah global Cari dalam skop global Pada masa ini, X ialah 2, jadi hasilnya ialah 2
扔个三星炸死你2017-07-05 10:39:59
var x = 1;
function foo(x, y = function () { x = 2; }) {
var x = 3;
eval(`(${y.toString()})()`);
console.log(x);
}
foo();