js中的函數

/* 來源具體可查看《JavaScript模式》 */

一、函數特點

1、函數時第一類對象

  • 函數在運行時動態創建,還可以在程序執行過程中創建
  • 函數可以分配給變量,可以將它們的引用複製到其他變量,可以被擴展,此外,除少數情況外,函數還可以刪除
  • 可以作爲參數傳遞給其他函數,並且還可以由其他函數返回
  • 函數可以有自己的屬性和方法

2、函數提供了作用域

在函數內部以var關鍵字定義的任何變量都是局部變量,對於外部函數是不可見的。(需注意對於if和for來說,並不意味着也是局部變量)

二、函數的定義

1、命名函數表達式

var add=function add(a,b) {
        return a + b;
    };

2、函數表達式,又稱匿名表達式

var add=function (a,b) {
        return a + b;
    };

3、函數聲明

function add(a,b) {
        return a + b;
    }

三、函數的提升

函數聲明與命名函數表達式或者匿名函數的區別在於提升行爲。

函數聲明被提升到了函數頂部(a函數整體),而表達式b,僅提升了var b;
可參考 函數的預解析和逐行解讀

function test() {
        console.log(typeof a);  //function
        console.log(typeof b);  //undefind

        a();  //'我被彈出'
        b();  //' b is not a function ' 

        function a() {
            alert('我被彈出');
        }
        var b=function () {
            alert('我沒有彈出')
        }
    }
    test();

四、函數相關的模式

1、回調模式。
函數都是對象,因此它們可以作爲參數傳遞給其他函數。

function getResult() {
    //獲取到一些值
}
function doSth(callback) {
    callback();
    //do something
}
doSth(getResult)

2、返回函數

var steup = function () {
    var count = 0;
    return function () {
        return (count += 1)
    };
};
    var next=steup();
    next();  //1
    next();  //2
    next();  //3

steup()包裝了返回函數,創建了一個閉包,可以使用這個閉包存儲一些私有數據,而這些數據僅可被該返回函數訪問,但外部代碼無法訪問。

3、自定義函數(惰性函數)
函數可以動態定義,也可以分配給變量。

var scareMe = function () {
        alert('逗');
        scareMe=function () {
            alert('逗b歡樂多')
        };
    };  

    scareMe();  //'逗'    
    scareMe();  //'逗b歡樂多'    
    scareMe();  //'逗b歡樂多'    
    scareMe();  //'逗b歡樂多'    
    scareMe();  //'逗b歡樂多'

當函數有一些初始化準備工作要做,並且僅需要執行一次,這種模式函數很有用的。

4、即時函數(自調用)

語法:

(function () {
    alert('hello');
}());

 (function () {
    alert('hello');
})();

即時函數的返回值
1、具體的值

var result=(function () {
    return 2+2;
}())

2、任意的值

var result=(function () {
    var res= ?;  //獲取需要的值;
    return function () {
        return res;
    };
}())

優點:
定義的所有這些變量將會是用於自調用函數的局部變量,並且不用擔心全局空間被臨時變量所污染。

/待完善/

發佈了61 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章