閉包數組
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
解析:
再建立一個函數,用該函數的參數綁定循環變量當前的值。不管該循環變量後續如何更改。已綁定到函數參數的值不變。