Function類型數組
ECMAScript中函數是對象,每一個函數都是Function類型的實例,也有屬性和方法,函數是對象,函數名實際上市一個指向函數對象的指針,不會與某個函數綁定;app
function sum(num1,num2){函數
return num1+num2;this
}spa
同:prototype
var sum=function(num1,num2){指針
return num1+num2;對象
};繼承
(1)沒有重載ip
若聲明瞭兩個同名函數,後面的函數會覆蓋前面的函數;
(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;
當函數在嚴格模式下運行時,訪問arguments.callee會致使錯誤,argumen.caller也是,在非嚴格模式下這個屬性始終是undefined;
在嚴格模式下不能爲函數的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
在嚴格模式下,爲指定環境對象而調用函數,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方法始終都會返回函數的代碼;