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);
}
}