JavaScript-閉包

1、閉包實例

function test() {
var arr = [];
for (var i = 0; i < 10; i++) {
arr[i] = function () {
document.write(i + "");
}
}
return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++) {
myArr[j]();
}

2、上述閉包輸出結果:10 10 10 10 10 10 10 10 10 10 

分析:1、arr[i]=function(){document.write(i+"")}是賦值語句;所以document.write(i+"")是沒執行的;因此for循環中的i和數組中function的i不是一一對應實時的;可也通過

function test() {
            var arr = [];
            for (var i = 0; i < 10; i++) {
                arr[i] = function () {
                        document.write(i + "");
                    }
            }
            return arr;
        }
        var myArr = test();
        for (var j = 0; j < 10; j++) {
            document.write(myArr[j]);
        }

輸出結果爲:function(){document.write(i+" ")}function(){document.write(i+" ")}function(){document.write(i+" ")}..........

2、閉包中產生閉包;所以最後函數執行的時候,函數訪問的i是test函數作用域中i的變量,而那時候函數i的值已經是10了;所以下面在執行數組中的函數的時候查詢的i的值全是10;

3、有什麼辦法可也讓函數輸出爲正常的數字序列嗎?下面這個寫法可也解決,有且僅當這樣寫才能解決閉包的一個問題,其原理就是產生一個閉包對應一個閉包的作用域鏈;

function test() {
var arr = [];
for (var i = 0; i < 10; i++) {
(function (j) {
arr[j] = function () {
document.write(j + "");
}
}(i));
}
return arr;
}
var myArr = test();
for (var j = 0; j < 10; j++) {
myArr[j]();
}
最後輸出結果爲0,1,2,3,4........;輸出結果正常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章