官术网_书友最值得收藏!

4.1 創建function

在JS中創建function的常用方法有兩種:函數聲明和函數表達式(還有一種使用Function創建的方法,一般很少用,本書就不介紹了)。

4.1.1 函數聲明

函數聲明的結構如下。

    function函數名(參數) {函數體}

函數一共由4部分組成,第一部分是function關鍵字,這個是固定不變的;第二部分是函數名;第三部分是一對圓括號,里面存放函數的參數,可以為空,也可以有多個,如果有多個,則使用逗號分隔;第四部分是用花括號包含的函數體,它是函數的具體內容。例如下面的語句可以定義一個log函數。

    function log(s) {
        console.log(s);
    }

這個函數的函數名為log,有一個s參數,函數體的內容是將參數打印到控制臺。使用這個函數來打印日志比直接調用console.log(msg)的書寫更為簡單,而且如果都調用此函數來打印日志的話還可以很容易地修改打印方式。

4.1.2 函數表達式

函數表達式的結構與函數聲明相比,是將函數聲明中的函數名去掉,然后將創建的結果賦值給一個變量,例如前面的log函數可以使用下面的函數表達式來創建。

    var log =  function(s) {
        console.log(s);
    }

這樣創建出來的log函數和前面通過函數聲明創建出來的log函數基本沒有區別。

4.1.3 兩種創建方式的關系

在JS中所有的數據只有兩種存在形式,要么是對象的屬性,要么是變量(后面將詳細講解這兩種形式的區別),函數也不例外,無論是對象的屬性還是變量都是名值對的結構,因此函數也應該是這種名值對的結構,由函數表達式可以很容易看明白這一點。其實,通過函數聲明方式創建函數時,JS在背后自動幫用戶做了這件事情,它首先創建了函數對象,然后又創建了跟函數名同名的變量,并將創建出來的函數賦值給了這個變量。所以,前面通過函數聲明創建的log函數等價于下面的語句。

    var log = function log(s) {
        console.log(s);
    }

這一點使用FireBug可以清楚地看到。先在FireBug中執行下面的代碼。

    function F(a){}
    var f = F;

然后可以在FireBug的DOM選項卡中看到如圖4-1所示的結構。

圖4-1 FireBug中的DOM選項卡

從圖4-1中可以看出,函數聲明語句首先創建了名為F的函數,然后將其值賦給同名的F變量,在定義f變量的語句中f也指向了創建的F函數對象。此時內存中的結構如圖4-2所示。

圖4-2 f變量和F函數在內存中的結構

可以將F設置為null,然后使用f調用F函數對象。因為設置的F只是自動創建出來的變量,所以并不會影響F函數對象本身,也就不會影響f的調用,可以將上面的代碼修改為如下代碼。

    function F(a){
        console.log(a);
    }
    var f = F;
    F = null;
    f("hello function");     //輸出hello function

此時的內存結構如圖4-3所示。

圖4-3 f變量在內存中的結構

上面講的是通過函數聲明創建的function對象。通過函數表達式來創建其實道理也差不多,不同之處在于它會創建一個匿名函數,然后再賦值給定義的變量。例如,在FireBug中執行如下代碼。

    var anonymous = function (b) {}
    var anony = anonymous;

此時,FireBug中的結構如圖4-4所示。

圖4-4 FireBug中的結構

此時,anonymous和anony兩個變量都指向一個匿名函數,內存結構如圖4-5所示。

圖4-5 anonymous和anony兩個變量都指向一個匿名函數的內存結構

主站蜘蛛池模板: 当涂县| 新安县| 库车县| 广丰县| 荃湾区| 微山县| 廊坊市| 新巴尔虎右旗| 科技| 界首市| 开鲁县| 福鼎市| 雷波县| 罗平县| 凤台县| 牡丹江市| 常德市| 咸丰县| 高青县| 乐陵市| 元谋县| 蓬溪县| 灵川县| 阳山县| 平邑县| 宁化县| 丰县| 抚松县| 阿城市| 龙山县| 长葛市| 建阳市| 大理市| 巴马| 阿瓦提县| 祥云县| 太仆寺旗| 临汾市| 宜都市| 瑞丽市| 达孜县|