JavaScript引用類型--Function類型

JavaScript中,“函數是對象,函數名是指針”

函數通過兩種方式定義:函數聲明和函數表達式

函數聲明:
function sum(num1, num2){
    return num1 + num2;
}

函數表達式:
var sum = function(num1, num2){
    return num1 + num2;
}

兩種定義方式卻別在於:通過變量名訪問函數的時機

例子:
    alert(sum(10,10));
    function sum(num1, num2){
        return num1 + num2
    };
    以上代碼是可以正常運行的,在代碼執行之前,解析器已經讀取並將聲明添加到執行環境中
    如果將函數聲明改爲函數表達式定義,則會出現錯誤:
    alert(sum(10,10));
    var sum = function (num1, num2){
        return num1 + num2
    };
    錯誤原因在於函數位於一個初始化語句中,而不是一個函數聲明

JavaScript中沒有函數重載

函數可以作爲值來使用,不僅可以像傳遞參數一樣把一個函數傳遞給另一個函數

function callSomeFunction(someFunction, someArgument){
    return someFunction(someArgument);
}

function add10(num){
     return num + 10;
}
var result1 = callSomeFunction(add10, 10);
alert (result1);        //20

function getGreeting(name){
    return "Hello" + name;
}

var result2 = callSomeFunction(getGreeting, "Nicholas");
alert (result2);    // "Hello Nicholas"

也可以將一個函數作爲另一個函數的結果返回

function createComparisonFunction(propertyName){
    return function(object1, object2){
        var value1 = object1[propertyName];
        var value2 = object2[propertyName];

        if (value1 < value2){
            return -1;
        } else if (value1 > value2){
            return 1;
        } else {
            return 0;
        }
    }
}

函數內部屬性:
函數內部有兩個特殊的對象: arguments 和 this

arguments是一個類數組對象,包含傳入函數中的所有參數。其callee屬性是一個指針,用於指向擁有這個arguments對象的函數
    function factorial(num){
        if (num <= 1){
            return -1;
        } else {
            return num * factorial(num -1);
        }
    }

上面的程序定義沒有問題,但是函數的執行與函數名factorial緊緊耦合,arguments.callee可以消除這種耦合現象

    function factorial(num){
        if (num <= 1){
            return -1;
        } else {
            //return num * factorial(num -1);
            return num * arguments.callee(num - 1);
        }
    }
發佈了36 篇原創文章 · 獲贊 18 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章