執(zhí)行環(huán)境
在javscript中執(zhí)行環(huán)境主要分為兩種
-
全局執(zhí)行環(huán)境
:NodeJs中為global书幕,所有的全景屬性和方法全都掛在gloabl上,可以在任意地方訪問,其生命周期直至程序退出時銷毀。 -
函數(shù)執(zhí)行環(huán)境
:當(dāng)執(zhí)行一個函數(shù)時坷澡,v8引擎進入函數(shù)執(zhí)行環(huán)境,函數(shù)代碼執(zhí)行完畢則銷毀含蓉。
所有的執(zhí)行環(huán)境以棧的形式管理洋访,底部是全局執(zhí)行環(huán)境,頂部是當(dāng)前函數(shù)執(zhí)行環(huán)境谴餐。
function outer() {
function inner() {
};
inner();
}
outer();
執(zhí)行outer函數(shù)時執(zhí)行環(huán)境棧為:(頂部)inner函數(shù)執(zhí)行環(huán)境-outer函數(shù)執(zhí)行環(huán)境-global全局執(zhí)行環(huán)境(底部)
每一個執(zhí)行環(huán)境都對應(yīng)一個變量對象姻政,保存著形參
、var定義的變量
岂嗓、函數(shù)聲明
作用域鏈
作用域鏈?zhǔn)钱?dāng)前執(zhí)行環(huán)境所關(guān)聯(lián)變量對象列表汁展,在函數(shù)定義時創(chuàng)建,當(dāng)查找變量時,從自身變量對象一直向父環(huán)境變量對象查找(就近原則)
//test.js
color = 'yellow';
var color = "blue";
function getColor() {
var color = "red";
return color;
}
console.log(getColor());
這里存在三個執(zhí)行環(huán)境食绿,因此關(guān)聯(lián)三個變量對象侈咕,1是函數(shù)getColor之內(nèi),1是getColor之外test.sj文件之內(nèi)器紧,3是全局global耀销,查找變量時依次從1-2-3順序查找,找到即停铲汪。
** ps:一般js中的全局變量直接掛載在global上熊尉,nodejs把js文件封裝進了函數(shù) **
閉包
閉包是一個可以訪問其他函數(shù)內(nèi)部變量的函數(shù)。
- 閉包可以用來訪問函數(shù)內(nèi)部變量
- 閉包緩存變量于內(nèi)存
閉包實現(xiàn)獲取函數(shù)調(diào)用次數(shù)
function compute() {
var _object = {};
function finalCompute() {
var key = finalCompute.caller.toString().match(/function\s*([^(]*)\(/)[1] || '匿名函數(shù)';
if (!_object[key])
_object[key] = 0;
_object[key] += 1;
console.log(`第${_object[key]}次調(diào)用function ${key}`);
}
return {'finalCompute': finalCompute, '_object': _object};
}
const com = compute();
閉包實現(xiàn)累加
function add() {
var _total = 0;
return function (para) {
_total += para;
return _total;
}
}
var ADD = add();
閉包實現(xiàn)緩存
const co = function () {
let cache = null;
return function (a, b) {
if (!cache) {
cache = a * b;
console.log('超時計算');
}
return cache;
}
};
const user = co();
console.log(user(3, 4));
console.log(user(5, 6));