標籤:
Function類型
ECMAScript中函數是對象,每個函數都是Function類型的執行個體,也有屬性和方法,函數是對象,函數名實際上市一個指向函數對象的指標,不會與某個函數綁定;
function sum(num1,num2){
return num1+num2;
}
同:
var sum=function(num1,num2){
return num1+num2;
};
(1)沒有重載
若聲明了兩個同名函數,後面的函數會覆蓋前面的函數;
(2)函式宣告和函數運算式
解析器會率先讀取函式宣告,並使其在執行任何代碼之前可以訪問,而函數運算式,必須等到解析器執行到它所在的程式碼,才會真正被解釋執行;
alert(sum(10,10));
function sum(num1,num2){
return num1+num2;
}
以上代碼正常執行,解析器在代碼執行之前,讀取並將函式宣告添加到執行環境中,對代碼求值時,js引擎在第一遍會聲明函數並將它們放到原始碼樹的頂部;
以下代碼中(函數運算式方法),在執行期間導致錯誤
alert(sum(10,10));
var sum=function(num1,num2){
return num1+num2;
}
函數位於一個初始化語句中,而不是一個函式宣告,在執行到函數所在的語句之前,變數sum中不會儲存有對函數的引用;
(3)作為值的函數
函數本身就是變數,函數可以作為值來使用,不僅可以像傳遞參數一樣把一個函數傳遞給另一個函數,而且可以將一個函數作為另一個函數的結果返回;
function callSomeFunction(somFunction,someArgment){
return someFunction(someArgment);
}
function add10(num){
return num+10;
}
var result=callSomeFunction(add10,10);
alert(result); //20
可以從一個函數中返回另一個函數
function createComparisonFunction(propertyName){
return function(object1,object2){
var value1=object1[propertyName];
var value2=object2[propertyName];
if (value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else {
return 0;
}
};
}
(4)函數內部屬性
在函數內部有兩個特殊的對象:arguments和this;
arguments儲存函數參數,還有個callee屬性,為一個指標,指向擁有這個arguments對象的函數;
function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
this引用的是函資料以執行的環境對象;
ECMAScript5規範了另一個函數對象屬性:caller,這個屬性中儲存著調用當前函數的函數的引用;如果是在全域範圍中調用當前函數,它的值為null;
當函數在strict 模式下運行時,訪問arguments.callee會導致錯誤,argumen.caller也是,在非strict 模式下這個屬性始終是undefined;
在strict 模式下不能為函數的caller屬性賦值,否則會導致錯誤;
(5)函數屬性和方法
每個函數都包含兩個屬性:length和prototype;
length屬性工作表示函數希望接收的具名引數的個數;
對於ECMAScript中的參考型別而言,prototype是儲存它們所有執行個體方法的真正所在,prototype屬性不可枚舉;
每個函數都包含兩個非繼承而來的方法:apply和call;在特定的範圍中調用函數,即設定函數體內this對象的值;
apply方法接收兩個參數:一個是在其中運行函數的範圍,另一個是參數數組(可以是Array的執行個體,也可以是arguments);
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
在strict 模式下,為指定環境對象而調用函數,this值不會轉型為window;
call方法,傳遞給函數的參數必須逐個列舉出來
function sum(num1,num2){
return num1+num2;
}
function callSum(num1,num2){
return sum.apply(this,num1,num2);
}
alert(callSum(10,10)); //20
apply和call真正強大的地方時能夠擴充函數賴以啟動並執行範圍;
window.color=”red”;
var o={color:”blue”};
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
ECMAScript5還定義了bind方法,這個方法會建立一個函數執行個體,其this值會被綁定到傳給bind函數的值:
window.color=”red”;
var o={color:”blue”};
function sayColor(){
alert(this.color);
}
var objectSayColor=sayColor.bind(o);
objectSayColor(); //blue
每個函數繼承的toLocalString和toString方法始終都會返回函數的代碼;
JavaScript讀書筆記(6)-Function