Adakah rantaian skop JavaScript ditentukan apabila fungsi ditakrifkan atau apabila ia dipanggil?
欧阳克
欧阳克 2017-07-05 10:42:15
0
5
1125

Lihat masalah penutupan berikut

var x=10;
function fn() {
    console.log(x);
}

function show(f) {
    var x=20;

    (function() {
        f();
    })();
}
show(fn);

Ia mencetak 10 dan bukannya 20. Apabila x diambil, bukankah ia akan melihat di sepanjang rantai skop Jika rantai skop ditentukan apabila fungsi dicipta, hasilnya akan menjadi 10. Jika ia ditentukan apabila fungsi itu? dipanggil, ia sepatutnya 20. Ya Tidak pernyataan yang tepat tentang rantai skop? Apakah rupa rantai skop yang tepat di sini? Adakah fn dan show berada pada tahap yang sama atau adakah fn dalam show?

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

membalas semua(5)
学霸

Rantai skop ditentukan apabila fungsi ditakrifkan.

Pembolehubah yang ditakrifkan dalam fungsi tidak boleh diakses di mana-mana di luar fungsi, kerana pembolehubah hanya ditakrifkan di dalam domain fungsi tersebut. Sejajar dengan itu, fungsi boleh mengakses sebarang pembolehubah dan fungsi yang ditakrifkan dalam skopnya. Dengan kata lain, fungsi yang ditakrifkan dalam skop global boleh mengakses semua pembolehubah yang ditakrifkan dalam skop global. Fungsi yang ditakrifkan dalam fungsi lain juga boleh mengakses semua pembolehubah yang ditakrifkan dalam fungsi induknya dan sebarang pembolehubah lain yang boleh diakses oleh fungsi induk itu.

https://developer.mozilla.org...

習慣沉默

Rantai skop adalah dinamik, jadi ia ditentukan pada masa panggilan.
Tetapi dalam kod anda, fungsi() yang ditakrifkan oleh penutupan ialah skop paling luar pengikatan
Fungsi yang diisytiharkan oleh fungsi lalai kepada skop paling luar pengikatan

(saya pun tengah belajar...)

洪涛

Buat rantai skop yang mengandungi objek pembolehubah global apabila fungsi dicipta dan simpannya dalam atribut [[Skop]] dalaman. Apabila fungsi dilaksanakan, persekitaran pelaksanaan akan dibuat Dengan menyalin objek dalam atribut [[Skop]], rantaian skop persekitaran pelaksanaan akan dibina dan objek aktifnya sendiri akan ditolak ke hujung hadapan. rantaian skop untuk membentuk satu rantaian domain yang lengkap. [[Skop]] memegang rujukan kepada pembolehubah global, bukan salinan nilai.

var a = 10;
function f(){
    console.log(a);
};
function foo(){
    a = 20;
    f();
};
foo() // 20;
阿神

Kaedah penutupan panggilan adalah bersamaan dengan kesan berikut Contoh yang diberikan di bawah menggambarkan melalui perbandingan bahawa rantai skop berkaitan dengan kedudukan apabila fungsi ditakrifkan.

var x=10;
function fn(){
    console.log(x);
}
function show() {
    var x=20;
    fn();
}
show();  //输出10
-----------------------
var x=10;
function show() {
    var x=20;
    function fn(){
        console.log(x);
    }
    fn();
}
show();  //输出20

Pautan soalan yang berkaitan ditambah. /q/10…. Terdapat perbincangan mengenai rantai skop.

扔个三星炸死你

Dalam mod tidak ketat, titik mana-mana IIFE ini ialah tingkap

Di atas tidak betul. . .

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!