javascript - Saya baru mempelajari penutupan dan saya tidak begitu faham. Tolong beri saya nasihat.
大家讲道理
大家讲道理 2017-06-26 10:58:00
0
7
683
function box() {
    var arr = [];
    for (var i = 0; i < 5; i++) {
        arr[i] = function () {
            return i;
        }
    }
    return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
    alert(b[i]);
}     

Selepas box() dilaksanakan, mengapa nilai dalam arr[0] hingga arr[4] semua berfungsi () { return i;}
Mengapa mereka tidak: function () {return 0;}, function ( ) {kembali 1;}. . .

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(7)
学习ing

Oleh kerana penutupan hanya boleh mendapatkan nilai terakhir mana-mana pembolehubah dalam fungsi, yang di sini merujuk kepada pembolehubah i, fungsi kotak() mengembalikan tatasusunan fungsi selepas pelaksanaan, dan setiap i dalam tatasusunan merujuk kepada pembolehubah A yang sama i . Perhatikan bahawa box() mengembalikan fungsi! Jadi {return i} inside hanyalah pernyataan dalam fungsi dan belum dilaksanakan lagi, jadi sudah tentu {return i} kekal tidak berubah. Kerana ia merujuk kepada i luaran yang sama, apabila fungsi kotak() kembali, nilai pembolehubah luaran i ialah 5. Pada masa ini, setiap pulangan merujuk kepada objek pembolehubah yang sama yang menyimpan pembolehubah i, jadi jika dalaman The fungsi dalam arr[], nilai i di dalam setiap fungsi ialah 5.

//执行内部返回的arr中的函数,当然box()[1]()、box()[2]()、box()[3]()...都返回5;
    function box() {
        var arr = [];
        for (var i = 0; i < 5; i++) {
             arr[i] = function () {
                return i;
            }
        }
        return arr;
    } 
    box()[1](); //执行后返回5

//不执行内部函数,仅仅是box()的话,当然只返回一个function咯
    function box() {
        var arr = [];
        for (var i = 0; i < 5; i++) {
             arr[i] = function () {
                return i;
            }
        }
        return arr;
    } 
    box(); //[function, function, function, function, function]
伊谢尔伦

Kerana rantai skop yang dikaitkan dengan penutupan adalah "hidup" Dan mereka berkongsi pembolehubah i , dan bukannya memberikan salinan berasingan nilai setiap pembolehubah terikat Mereka hanya rujukan i pada setiap peringkat tidak akan disimpan

Buku Rujukan: Panduan Definitif untuk JavaScript Bahagian 8.6.

淡淡烟草味
function box() {
    var arr = [];
    for (var i = 0; i < 5; i++) {
        arr[i] = function () {
            return i;
        }();
    };
    return arr;
}

这样就是了
世界只因有你
function box() {
    var arr = [];
    for (var i = 0; i < 5; i++) {
        arr[i] = (function () {
            return i;
        })(i)
      }
    return arr;
  }
var b = box();
for (var i = 0; i < 5; i++) {
    alert(b[i]);
 }
阿神

Dalam contoh, fungsi dalam gelung for hanya diberikan nilai dan tidak dilaksanakan, jadi nilai i hanya diperoleh apabila fungsi dalam tatasusunan dilaksanakan Pada masa ini, i hanya mempunyai nilai pada penghujung gelung. Tiada penutupan digunakan di tingkat atas, hanya fungsi tanpa nama yang dilaksanakan mendapat nilai i untuk setiap gelung
Kaedah: 1. Gunakan ES6 let untuk menggantikan var
function box() {

    var arr = [];
    for (let i = 0; i < 5; i++) {
        arr[i] = function () {
            return i;
        }
    }
    return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
    alert(b[i]());
}

2. Gunakan penutupan
kotak fungsi() {

    var arr = [];
    for (var i = 0; i < 5; i++) {
        arr[i] = function (x) {
            return function(){
                return x;
            };
        }(i);
    }
    return arr;
}
var b = box();
for (var i = 0; i < 5; i++) {
    alert(b[i]());
}
我想大声告诉你

. Perkataan "penutupan" berasal daripada gabungan blok kod yang akan dilaksanakan (kerana pembolehubah bebas terkandung dalam blok, pembolehubah bebas ini dan objek yang dirujuknya tidak dilepaskan) dan pengikatan yang disediakan untuk pembolehubah bebas. Persekitaran pengkomputeran (skop) ---Baidu Encyclopedia
bermaksud

function () {
                return i;
            }

Ini adalah blok kod Fungsinya hanya untuk merujuk i, supaya pegangan i akan menghalang i daripada dilepaskan hanya blok kod ini Ia adalah, ia hanya akan mencari i apabila ia berjalan, jadi anda boleh mengeluarkan semua arr anda, dan semua output hendaklah 5

我想大声告诉你
// arr的元素均是下面这个函数 
function(){
    return i; 
}
Apa

dikira hanya apabila i dipanggil.

Apabila memanggil fungsi ini, for telah ditamatkan, jadi nilai semasa mengambil for 已经结束,因此取 i 的时候值是 5 ialah 5

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan