JS-函數(shù)讀書筆記
1.函數(shù)就是對象函數(shù)可以存放變量,數(shù)組,對象
函數(shù)可以當(dāng)做參數(shù)傳遞給其他函數(shù)
函數(shù)可以返回函數(shù)
函數(shù)可以擁有方法
2.函數(shù)的調(diào)用
調(diào)用運(yùn)算符是任何一個產(chǎn)生函數(shù)值的表達(dá)式之后的一對圓括號。
調(diào)用一個函數(shù)將暫停當(dāng)前函數(shù)的執(zhí)行,傳遞控制權(quán)和參數(shù)給新函數(shù),除了聲明時定義的形參,每個函數(shù)接收兩個附加的參數(shù)-this和arguments。
this的值取決于調(diào)用的模式:
方法調(diào)用模式:函數(shù)被保存為對象的一個屬性時,稱為方法。方法被調(diào)用時,this綁定到該對象。
var obj={
value:0,
increment:function(){
this.value+=1;
}
}
obj.increment();
obj.value;
函數(shù)調(diào)用模式:當(dāng)一個函數(shù)并非對象的屬性時,它被當(dāng)作一個函數(shù)來調(diào)用,this綁定到全局對象(Window),因此不能共享外部函數(shù)對對象的訪問權(quán)-語言設(shè)計的錯誤。當(dāng)內(nèi)部函數(shù)被調(diào)用時,this應(yīng)該仍綁定到外部函數(shù)的this變量。
解決方案:定義一個變量并給它賦值為this
var myObj={
value: 0,
getValue: function(){
return this.value;
}
};
myObj.test=function(){
var that = this
var helper=function(){
that.value+=1;
}();
}
myObj.test();
構(gòu)造器調(diào)用模式:如果一個函數(shù)前面帶上new來調(diào)用,將會創(chuàng)建一個隱藏連接到該函數(shù)的prototype成員的新對象,this將會綁定到新對象上。
var Quo = function(string){
this.status=string;
}
Quo.prototype.get_status=function(){
return this.status;
}
var myQuo=new Quo("confused");
myQuo.get_status();
apply調(diào)用模式:apply方法讓我們構(gòu)建一個參數(shù)數(shù)組并用其去調(diào)用函數(shù)。該方法允許我們選擇this的值,apply方法接收兩個參數(shù),第一個就是將被綁定給this的值,如果是null則為Window對象,第二個是參數(shù)列表。
var array=[3,4];
var sum=add.apply(null,array);
var Quo = function(string){
this.status=string;
}
Quo.prototype.get_status=function(){
return this.status;
}
var statusObj={
status:"OK"
};
Quo.prototype.get_status.apply(statusObj);
var myObj={
add:function(a,b){
//參數(shù)為null或#ff0000,this引用為Window, double函數(shù)的alert證明了這一點(diǎn)
alert(this.location.href);
return a+b;
}
}
var array=[3,4];
var sum=myObj.add.apply(null,array);
2.給類型增加方法:待續(xù)
3.閉包-能夠讀/寫函數(shù)內(nèi)部的某些變量的子函數(shù),并將這些變量保存在內(nèi)存中.
討論閉包之前先討論函數(shù)作用域
1)函數(shù)內(nèi)的局部變量在函數(shù)外部無法訪問。
function f(){
var n=1;
}
alert(n);//error
2)內(nèi)部函數(shù)可以訪問外部函數(shù)的局部變量。
function f(){
var n=1;
function inner(){
alert(n);
}
}
因此只要將inner作為返回值,就可以在f外部讀取它的內(nèi)部變量了。
function f(){
var n=1;
function inner(){
alert(n);
}
return inner;
}
f()();
閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。如果把父函數(shù)當(dāng)作對象使用,把閉包當(dāng)作它的公共函數(shù),把內(nèi)部變量當(dāng)作它的私有屬性。
理解內(nèi)部函數(shù)能訪問外部函數(shù)的實(shí)際變量而無須復(fù)制:
var add_handles=function(nodes){
for(var i=0;i<nodes.length;i++){
nodes[i].onclick=function(e){
alert(i);
}
}
}
var add_handles=function(nodes){
for(var i=0;i<nodes.length;i++){
nodes[i].onclick=function(i){
return function(e){
alert(e);
}
}(i);
}
}
閉包用途:
1)讀取函數(shù)內(nèi)部的局部變量
2)將變量的值始終保存在內(nèi)存中,因?yàn)閒是inner的父函數(shù),而inner被賦給了一個全局變量,導(dǎo)致inner始終在內(nèi)存中,而inner的存在依賴于f,因此f也始終在內(nèi)存中,不會在調(diào)用結(jié)束后被垃圾回收機(jī)制回收。
3)通過保護(hù)變量的安全實(shí)現(xiàn)JS私有屬性和私有方法(不能被外部訪問)
缺點(diǎn):閉包使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,不能濫用閉包。
4.模塊
一個定義了私有變量和函數(shù)的函數(shù),利用閉包創(chuàng)建可以訪問私有變量和函數(shù)的特權(quán)函數(shù),然后返回這個特權(quán)函數(shù)。
提供接口卻隱藏狀態(tài)與實(shí)現(xiàn)的函數(shù)或?qū)ο蟆^饤壛巳肿兞俊?br />