函數javascript
閉包java
<script type="text/javascript"> <!-- 在正常的腳本中,某個方法能夠獲取到外部的變量,或者全局變量 --> var num = 11; function func1(){ console.log(num); } func1(); <!-- 可是在外部是沒法獲取方法內部的局部變量的 --> function func2(){ var num1 = 22; num2 = 33; } func2(); <!--console.log(num1); 會報錯!--> console.log(num2); <!--能夠獲取到num2的值,由於不適用var定義變量時,默認是全局變量 --> <!-- 那麼如何在外部獲取到內部的變量呢!javascript能夠辦到 --> function func3(){ var num3 = 44; function func4(){ return num3; } return func4; } var func = func3(); console.log(func()); </script>
在外部沒法獲取到func3內部的局部變量,可是func3內部的局部方法func4卻能夠獲取到,所以 返回一個func4的引用 ,這樣在外部經過這個func4就能夠獲取到func3的內部變量。編程
雖然是繞了一個圈子,可是在方法外部卻經過這樣一個手段獲取到了內部的值。數組
而這個方法內的局部方法func4就叫作閉包,按照不少書上的概念,這個方法搭建了方法內部與方法外部的橋樑,使得在外部也能夠任意的獲取到方法內部的資源。閉包
可是閉包會形成變量在內存中持久佔用,所以會有必定的性能問題,最好不要輕易使用,即使使用也要在恰當的實際進行釋放。app
函數調用編程語言
調用一個函數會暫停當前函數的執行,傳遞控制權和參數給新函數。除了聲明時定義的形式參數,每一個函數還接收兩個附加的參數:this和arguments.函數
方法調用模式性能
//建立myObject對象。它有一個value屬性和一個increment方法this
//increment方法接受一個可選的參數。若是參數不是數字,那麼默認使用數字1
var myObject = {
value:0,
increment:function(inc){
this.value +=typeof inc ==='number'?inc:1;
}
};
myObject.increment();
document.writeln(myObject.value);//1
myObject.increment(2);
document.writeln(myObject.value);//3
函數調用模式
構造器調用模式
//建立一個名爲Quo的構造器函數。它構造一個帶有status屬性的對象。
var Quo = function(string){
this.status = string;
}
//給Quo的全部實例提供一個名爲get_status的公共方法
Quo.prototype.get_status = function(){
return this.status;
}
//構造一個Quo實例
var myQuo = new Quo("confused");
document.writeln(myQuo.get_status());//打印顯示confused.
Apply調用模式
//構造一個包含兩個數字的數組,並將它們相加
var array = [3,4];
var sum = add.apply(null,array);//sum值爲7
//構造一個包含status成員的對象
var statusObject = {
status:'A-OK'
}
//statusObject並無繼承自Quo.prototype,但咱們能夠在statusObject上調用get_status方法,儘管statusObject並無一個名爲get_status的方法。
var status = Quo.prototype.get_status.apply(statusObject); //status值爲‘A-OK’
參數
//構造一個將大量的值相加的函數。
//注意該函數的內部定義的變量sum不會與函數外部定義的sum產生衝突
//該函數只會看到內部的那個變量
var sum = function(){
var i,sum =0;
for(i=0;i<arguments.length;i+=1){
sum+=arguments[i];
}
return sum;
};
document.writeln(sum(4,8,15,16,26,42));//108
返回
異常
var add = function(a,b){
if(typeof a!=='number'||typeof b!=='number'){
throw{
name:'TypeError',
message:'add nedds numbers'
};
}
return a+b;
}
//構造一個try_it函數,以不正確的方式調用以前的add函數
var try_it = function(){
try{
add("seven");
}catch(e){
document.writeln(e.name+':'+e.message);
}
}
try_it();
擴充類型的功能
Function.prototype.method = function(name,func){
this.prototype[name] = func;
return this;
}
經過給Function.prototype增長一個method方法,咱們下次給對象增長方法的時候就沒必要鍵入prototype這幾個字符,省掉了一點麻煩。
Number.method('integer',function(){
return Math[this<0?'ceil':'floor'](this);
});
document.writeln((-10/3).integer());//-3
String.method('trim',function(){
return this.replace(/^\s+|\s+$/g,'');
})
document.writeln('"+" neat ".trim()+'"');
//符合條件時才增長方法
Function.prototype.method = function(name,func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
return this;
}
遞歸
繼承
this
未完待續……
注:如若喜歡,歡迎轉載,請在文章頁面明顯位置給出此文連接!
若您以爲這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發做者更大的寫做熱情,很是感謝!