函數(shù)是對象,連接到Function.prototype(該對象連接到Object.prototype),并在創(chuàng)建時附加兩個隱藏屬性:函數(shù)的上下文和實現(xiàn)函數(shù)行為的代碼。
var add = function(a, b){
return a + b;
}
調(diào)用
調(diào)用一個函數(shù)會暫停當(dāng)前函數(shù)的執(zhí)行洪灯,傳遞控制權(quán)和參數(shù)給新函數(shù)。除了聲明時定義的形式參數(shù)竟痰,每個函數(shù)還會接收兩個參數(shù):this和arguments签钩。實際參數(shù)arguments的個數(shù)與形式參數(shù)parameters的個數(shù)不匹配時掏呼,若參數(shù)過多,會被忽略边臼,若參數(shù)過少哄尔,缺失值被替換成undefined假消。
方法調(diào)用模式:當(dāng)一個函數(shù)被保存到對象的一個屬性時柠并, this被綁定到該對象。
函數(shù)調(diào)用模式:當(dāng)一個函數(shù)非一個對象的屬性時富拗,this被綁定到全局變量臼予。
構(gòu)造器調(diào)用模式:定義一個函數(shù)構(gòu)造器,this即為該新的對象
apply調(diào)用模式:函數(shù)調(diào)用apply方法啃沪,第一個參數(shù)綁定給this粘拾, 第二個參數(shù)時參數(shù)數(shù)組;
argument并非是真正的數(shù)組创千,而是一個"array-like"缰雇, 擁有一個length屬性,但是并沒有數(shù)組的方法追驴。
作用域
作用域控制著變量與參數(shù)的可見性及生命周期械哟,可以減少名稱沖突,并提供自動的內(nèi)存管理殿雪。
盡管JavaScript的代碼塊語法貌似支持塊級作用域暇咆,但實際上JavaScript并不支持。定義在JavaScript的函數(shù)中的參數(shù)和變量在函數(shù)外部是不可見的丙曙,而在一個函數(shù)的任何位置定義的變量爸业,在該函數(shù)內(nèi)部任何地方都可見。
閉包
閉包:函數(shù)變量可以被隱藏于作用域之內(nèi)亏镰,因此看起來函數(shù)將變量包裹起來扯旷。
舉幾個例子:
var scope = "global";
function checkScope(){
var scope = "local";
function f(){
return scope;
}
return f;
}
checkScope()(); //local
function counter(){
var n = 0;
return {
count: function(){return n++;}
reset: function(){ n=0;}
}
}
var c = counter(), d = counter();//c/d兩個作用域,相互不影響索抓。
c.count();
d.count();
d.reset();
閉包可以將變量隔離出來钧忽,作用域獨立,分配的內(nèi)存不會自動回收纸兔,所以在使用時不可濫用惰瓜。