對JavaScript中函式物件的理解

post200發表於2021-09-09

首先,來看一個求兩個數的和的函式

function sum(num1,num2){
    return num1 + num2;
};
alert(sum(1,2));        //3

這個函式很簡單,但是如果要求三個數的和呢,很容易會想到再加一個引數num3,同時將返回值也加上num3,那麼,求四個數的和,五個數的和呢?再用這種方式寫肯定是不行的,其實,js中的函式內部有一個物件叫做arguments,它是一個類陣列物件,裡面儲存著這個函式呼叫時傳入的引數:

function sum(){
    alert(arguments.length);
}
sum(1,2);      //2
function testArgs(){
    alert(arguments[0]);
}
testArgs(4,5);    //4

知道了auguments之後,可以把這個函式該寫成求任意個數字的和,只需要把這些數字傳入函式即可:

function sum(){
    var sum = 0;
    for(var i =0 ; i 

再來看一個遞迴求和的例子,也就是通常我們見到的求1~n的和,最初的方法可以採用以下這種方式實現:

function sum(n){
    if(n == 1){
        return 1;
    } else {
        return n+sum(n-1);
    }
}
alert(sum(5));    //15

有些時候由於命名衝突或者其他的一些原因,我們需要將函式重新命名,由於採用了遞迴,所以函式內部程式碼中的函式名也要修改,問題在於一個是要修改兩次,有些時候我們還會一遺忘..arguments物件有一個callee屬性,代表arguments物件屬於哪一個函式的,比如上面sum函式中arguments.callee就代表sum本身,所以,可以將程式碼修改成如下:

function sum(n){
    if(n == 1){
        return 1;
    } else {
        return n+arguments.callee(n-1);
    }
}
alert(sum(5));    //15

現在,我們就不用去關心函式內部的程式碼了,降低了程式碼的耦合.
js是支援物件導向程式設計的,只是它沒有類這個概念,有一種常用的方式就是透過建構函式+原型的方式來實現:

function Box(name,age){
    this.name = name;
    this.age = age;
}
var box = new Box("xwc",20);
alert(typeof box);    //"object"
alert(box instanceof Box);    //true

首先寫一個很普通的函式Box(建構函式),它就相當於別的面嚮物件語言中的類,然後用new運算子來例項化一個Box,命名為box,現在box就是Box的一個例項,這點用instanceof可以證明(typeof 在檢測基本型別的時候拿手,檢測某個物件是誰的例項還是用instanceof吧),到這裡,我相信很多人關心這一切的背後到底發生了什麼,我查閱了一些資料,發現解釋是這樣的:使用new運算子之後,js引擎會在後臺建立一個空物件,然後把自己的作用域賦給建構函式,接著執行函式中的程式碼,(你也可以理解成這個物件呼叫了建構函式,所以this指向的是這個物件),最後返回這個物件。
其實,關於函式的東西還有很多,例如函式的apply呼叫,call呼叫還有原型,這裡一次描述完不太現實,另,由於本人水平有限,歡迎大家評論指錯交流。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2249/viewspace-2798051/,如需轉載,請註明出處,否則將追究法律責任。

相關文章