JavaScript讀書筆記(6)-Function

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方法始終都會返回函數的代碼;

相關文章
相關標籤/搜索