JavaScript讀書筆記(6)-Function

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.