function init() {
var name = "Mozilla"; // name 是個由 init 建立的區域變數
function displayName() { // displayName() 是內部函式(子函式),一個閉包
alert(name); // 使用了父函式宣告的變數:name
}
displayName();
}
init();
閉包通常都會用回傳 (return) 的方式,取得外部函式的變數 or 參數作運用。
function storeMoney() {
var money = 1000;
return function (price) {
money = money + price;
return money;
}
};
console.log(storeMoney());
//return 即為表達式,代表function storeMoney會從return回傳一個值出來,因為無參數,所以傳出function (price)。
console.log(storeMoney()(100)); 1100
var Kingmoney = storeMoney();
console.log(Kingmoney); //結果同console.log(storeMoney())
console.log(Kingmoney(1000)); //2000
console.log(Kingmoney(1000)); //3000 因為變數money一直被子函式參考,所以不會從記憶體中消除。
var Queenmoney = storeMoney();
console.log(Queenmoney(20)); //1020,參數更改
console.log(Queenmoney(20)); //1040
function arrFunction() {
var arr = [];
for (var i = 0; i < 3; i++) {
arr.push(function () {
console.log(i);
});
}
console.log(arr);
console.log('i', i); // i 3
return arr;
}
var fn = arrFunction();
fn[0]();
fn[1]();
fn[2]();
var arr = []; //3 3 3
因為變數i皆會等迴圈結束後才會把最後i的值帶入函式,所以無論參數是多少,子函數都會參考到 for 迴圈中的i。
利用立即函式的特性,每執行一次迴圈,立即執行一次立即函式;本例利用迴圈的變數c填入立即函數的參數(newc)位置。
function arrFunction() {
var arr = [];
for (var c = 0; c < 3; c++) {
(function (newc) {
arr.push(function () {
console.log(newc);
});
})(c)
};
return arr;
}
var fn = arrFunction();
fn[0]();
fn[1]();
fn[2]();
var arr = [];
function arrFunction() {
var arr = [];
for (let c = 0; c < 3; c++) {
arr.push(function () {
console.log(c);
});
}
console.log(arr);
// console.log('c', c);
return arr;
}
var fn = arrFunction();
fn[0]();
fn[1]();
fn[2]();
var arr = [];
function carprice(GPS) {
var car = 1000;
var sum = 0;
GPS = GPS || 0; //當GPS有被填入參數值的時候選擇參數值,如果沒填入則為0。
return function (GPS) {
sum = GPS + car;
return sum;
};
};
var Tom = carprice();
console.log(Tom(1000));
參考文章: