閉包與函數

閉包數組

var name = 'window'
function closure() {
    var name = 'init';
    return {
        get_name: function () {
            return name
        },
        set_name: function (value) {
            name = value;
            return name;
        }
    }
}
var result = closure()
console.log(result.get_name());
result.set_name('syj');
console.log(result.get_name());
複製代碼

答案:init syjbash

解析:閉包

result.get_name() =>function () {
            return name
        }
複製代碼

由於當前沒有name變量,因此往上查找到變量init. result.set_name('syj'); 把name變量的值給改爲了syj,因此最後打印syj函數

引用類型ui

function lazy_sum(arr) {
    var sum = function () {
        return arr.reduce(function (x, y) {
            return x + y;
        });
    }
    return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]); 
f(); 
console.log(f());
var f1 = lazy_sum([1, 2, 3, 4, 5]);
var f2 = lazy_sum([1, 2, 3, 4, 5]);
console.log(f1 === f2);
console.log(f1() === f2());
複製代碼

答案:15 false truespa

解析: reduce數組求和。因此第一個是15, f1 == f2是兩個數組進行比較。由於數組是引用數據類型在內存空間裏建立的兩個地址。因此爲false。而f1() =>code

arr.reduce(function (x, y) {
    return x + y;
});
內存空間只有一個這個方法。而f1和f2都指向的這個方法。因此f1() === f2()爲true複製代碼

function count() {
    var arr = [];
    for (var i = 1; i <= 3; i++) {
        arr.push(function () {
            return i * i;
        });
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];
console.log( f1());
console.log( f2());
console.log( f3());
複製代碼

答案:16 16 16內存

解析: 首先執行 var result = count()=>而後去執行for循環,每次循環都建立了一個f函數,把它們添加到arr中 =>arr[f,f,f];三個函數。返回的函數引用了變量i,但它並非當即執行。等三個函數返回時,再執行=>調用f1(),f2(),f3() 此時i爲4了分別打印三個16。f() => return i * i;get

若是必定要引用循環變量怎麼辦?string

function count() {
    var arr = [];
    for (var i = 1; i <= 3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];

f1(); 
f2(); 
f3(); 
console.log( f1());
console.log( f2());
console.log( f3());
複製代碼

答案:1 4 9

解析:

再建立一個函數,用該函數的參數綁定循環變量當前的值。不管該循環變量後續如何更改。已綁定到函數參數的值不變。

相關文章
相關標籤/搜索