// 這段程式碼為增加記憶體空間使用
function randomString(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
// 注意: 我們將 demoData 放在全域做宣告
// 此時記憶體空間約為 32MB
var demoData = [];
function getData() {
for(let i = 0; i < 1000; i++) {
demoData.push(randomString(1000))
}
}
getData();
若是放在函式內,記憶體空間約為 2MB
因為執行完函式後,demoData 沒有任何參照,所佔記憶體空間會被釋放掉
function getData() {
var demoData = [];
for(let i = 0; i < 1000; i++) {
demoData.push(randomString(1000))
}
}
getData();
把 demoData 丟到 setTimeout 裡
記憶體空間一開始會是 32MB,10 秒後會變成 2MB
function getData() {
var demoData = [];
for(let i = 0; i < 1000; i++) {
demoData.push(randomString(1000))
}
}
setTimeout(function() {
demoData;
}, 10000);
getData();
範例:閉包
function storeMoney() {
var money = 1000; // 因為範圍鍊的關係不會被釋放掉,給子函式做使用
return function(price) {
money = money + price;
return money;
}
}
console.log(storeMoney()); // 是一個表達式,會回傳一個值
// 回傳 f(price){...} 這個函式
console.log(storeMoney()()); // 再加一個 () 來執行後面的函式
console.log(storeMoney()(100)); // 1100
// 小明的錢包
var MingMoney = storeMoney(); // storeMoney() 為表達式
console.log(MingMoney); // f(price){...}
console.log(MingMoney(100)); // 1100
console.log(MingMoney(100)); // 1200
console.log(MingMoney(100)); // 1300
// 杰倫的錢包
var JayMoney = storeMoney();
console.log(JayMoney(1000)); // 2000
console.log(JayMoney(1000)); // 3000
console.log(JayMoney(1000)); // 4000