談談javascript的函數表達式及其應用

咱們都知道定義函數的方式有兩種,一種是函數聲明,另一種就是函數表達式數組

函數聲明

語法爲:function關鍵字後跟函數名。例如:瀏覽器

function functionName(arg0) {
    //函數體
}
alert(functionName.name)  // "functionName"

函數聲明最主要的特徵就是函數聲明的提高,因此咱們能夠把函數聲明放在調用它的語句的後面,由於執行代碼前會先讀取函數聲明。好比:閉包

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

上面的代碼能夠在瀏覽器正常運行。函數

函數表達式

語法以下:code

var functionName = function(arg0){
    //函數體
};
alert(functionName.name)  // ""

如上所示當咱們輸出函數名時返回了空字符串,由於function關鍵字後面沒有標識符,這種狀況下建立的函數爲匿名函數。接下來咱們就談談利用函數表達式所建立的匿名函數有什麼應用。索引

應用

函數表達式最典型的應用就是模仿塊級做用域,咱們都知道JavaScript沒有塊級做用域,不過咱們能夠用函數表達式模仿塊級做用域。造成獨立做用域,從而避免全局污染
操做方法:聲明匿名函數,立馬調用。
最經典的例子:ip

function createFunctions(){
    var result = [];
    for (var i=0; i < 10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result;
}
createFunctions();

乍一看每一個函數都應該返回本身的索引值,即位置0的函數返回0,1的返回1,以此類推。實際上每一個函數都將返回10,由於這裏的i是貫穿整個做用域的,咱們把上面代碼修改一下:作用域

//寫法1
(function(){
    //這裏是塊級做用域
    var result = [];
    for(var i=0;i<10;i++){
        result[i] = (function(num){
            return function(){
                return num;
            };
        }(i))();
    }
    return result;
})();   //[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
//寫法2
var hasfunction = function(){
    var result = [];
        for(var i=0;i<10;i++){
            result[i] = (function(num){
                return function(){
                    return num;
            };
        }(i))();
    }
    return result;
}
hasfunction();

在當即執行函數執行的時候,i的值被賦值給num,同時建立返回num的閉包,從而result數組每一個函數都有一個num變量的副本。字符串

完。io

相關文章
相關標籤/搜索