1.函式宣告和函式表示式
通過字面量建立函式的方式有兩種函式宣告和函式表示式:
函式宣告:
function sum(x, y) {
var result = x + y;
return result;
}
函式表示式:
var sum = function (x, y) {
var result = x + y;
return result;
};
函式宣告和函式表示式除了在語法上有一些差異外,作用都是一樣的。
函式宣告被提升到上下文的頂部(函式所在的作用域)。也就是說我們可以在函式宣告之前使用它,並且不會產生錯誤。例如:
var result = sum(3, 5);
console.log(result);
function sum(x, y) {
var result = x + y;
return result;
}
但是,函式表示式不能被提升,下面的程式碼會報錯:
var result = sum(3, 5);
console.log(result);
var sum = function (x, y) {
var result = x + y;
return result;
};
建議大家無論在使用哪種字面量的方式建立Function型別的物件時,一定要先宣告後使用。
2.將函式作為值
我可以像其他物件那樣使用函式,比如,可以將它們賦值給另一個變數,可以將將它們作為物件的屬性值,可以作為引數傳遞給其他函式,還可以作為其他函式的返回值。
1.可以將它們賦值給另一個變數
function sayHi() {
console.log('Hi!');
}
sayHi();
var sayHi2 = sayHi;
sayHi2();
2.可以將將它們作為物件的屬性值
function sayHi() {
console.log('Hi!');
}
var person = {
name: '張三',
greeting: sayHi
};
person.greeting();
3.可以作為引數傳遞給其他函式
var numbers = [1, 25, 18, 4, 7, 10, 2, 6];
var result1 = numbers.sort();
console.log(result1);
var result2 = numbers.sort(function(a, b){
return a - b;
});
console.log(result2);
4.可以作為其他函式的返回值
function parent(){
var i = 0;
function child(){
i++;
console.log(i);
}
return child;
}
var func = parent();
func();
3.函式的引數
形參:建立函式時,指定的引數。
實參:呼叫函式時,實際傳遞給函式的引數。
函式另一獨特之處是無論我們傳遞給它多少個引數它都不會報錯。這是因為我們傳遞給函式的實參實際上被儲存到了一個類似於陣列的物件中,arguments
,陣列可以包含任意數量的元素,所以可以我們向函式傳遞任意數量的實參。我們在訪問這些引數的時候可以通過陣列下表的方式訪問。
function sum (x, y){
return x + y;
}
var result1 = sum(2, 3);
console.log(result1);
var result2 = sum(2, 3, 5, 6);
console.log(result2);
var result3 = sum();
console.log(result3);
var result4 = sum(2);
console.log(result4);
由於函式沒有形參,我們必須閱讀函式體內的程式碼才能知道函式需要幾個形參,所以很多開發人員願意使用arguments
物件。例如:
function sum(){
return arguments[0] + arguments[1];
}
然而,有些時候使用arguments
比使用形參更高效。比如,我們要建立一個用來求和的函式,它可以接受任意數量的引數,並返回它們的和。這個時候我們就不能形參,因為我們不知道會傳遞過來多少個實參,因此,使用arguments
是最好的選擇。
function sum() { var result = 0, i = 0, len = arguments.length; while(i < len){ result += arguments[i]; i++; } return result; } console.log(sum(2, 5, 7, 5, 5 ,90));