javascript 函數表達式

  1. 定義函數的兩種方式
//函數聲明,存在變量提升
function factorial(num) {
   console.log(num);
}

//函數表達式
var factorial = function(num) {
   console.log(num);
}
  1. arguments.callee() 指向正在執行的函數的指針,可以實現對函數的遞歸調用
//簡單的遞歸函數
function factorial(num) {
    if(num<=1) {
        return 1;
    } else {
        return num * factorial(num-1);
    }
}

但是這樣有個問題,如果是下面這種情況,就會出錯:

var anotherFactorial = factorial;
factorial = null;
anotherFactorial(5); //factorial is not a function

可以使用argument.callee()來解決這個問題:

function factorial(num) {
    if(num<=1) {
        return 1;
    } else {
        return num * arguments.callee(num-1);
    }
}
  1. 匿名函數和閉包
    3.1 創建一個函數並把它賦值給一個對象,這個時候創建的函數叫做匿名函數
    3.2 閉包是指有權訪問另一個函數作用域中的變量的函數,過度使用閉包會導致內存佔用過多
/*
每個函數的返回值都是10,因爲每個函數的作用域鏈中都保存着createFuc()函數的活動對象,所以它們引用的都是同一個變量i
*/
function createFuc() {
    var result = new Array();

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

    return result;
}

/* 打印查看結果 */
var r = createFuc();
for(var m = 0 ;m < 10; m++) {
    console.log(r[m]());
}
/*
通過創建另一個匿名函數強制讓閉包的行爲符合預期,不將閉包直接賦值給數組,而是定義域一個匿名函數,並將立即執行匿名函數的結果賦值給數組,匿名函數的參數num也就是最終要返回的值。函數參數是按照值傳遞的,所以會將i的當前值複製給 參數num,這樣數組中的每個函數都有自己num變量的一個副本,就返回了不同的值。
*/
function createFuc() {
    var result = new Array();

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

    return result;
}

/* 打印查看結果 */
var r = createFuc();
for(var m = 0 ;m < 10; m++) {
    console.log(r[m]());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章