定義函數(shù)的一種方法是通過函數(shù)聲明:
function add(param1, param2) {
return param1 + param2;
}
上面的代碼定義一個名稱叫做add的函數(shù),有兩個參數(shù)param1和param2,并且返回參數(shù)的和。下面是如何調用這個函數(shù):
> add(6, 1)
7
> add('a', 'b')
'ab'
另一種定義add()函數(shù)的方法是通過函數(shù)表達式:
var add = function (param1, param2) {
return param1 + param2;
};
函數(shù)表達式產(chǎn)生一個值,因此可以直接將函數(shù)作為參數(shù)傳遞給其他函數(shù):
someOtherFunction(function (p1, p2) { ... });
函數(shù)聲明會被提升,他們全被移動到當前作用域開始之處。這允許你在函數(shù)聲明之前調用它們:
function foo() {
bar(); // 沒問題,bar被提升
function bar() {
...
}
}
注意:雖然變量聲明也會被提升,但賦值的過程不會被提升:
function foo() {
bar(); // 有問題,bar是undefined
var bar = function () {
// ...
};
}
在JavaScript中你可以調用任意函數(shù)并傳遞任意數(shù)量的參數(shù)——語言絕不會抱怨(參數(shù)檢測)。都可以正常工作,然而,使所有參數(shù)可訪問需要通過特殊變量 arguments。arguments 看起來像數(shù)組,但它沒有數(shù)組的方法(稱為類數(shù)組 array-like)。
> function f() { return arguments }
> var args = f('a', 'b', 'c');
> args.length
3
> args[0] // 獲取索引為0的元素
'a'
讓我們通過下面的函數(shù)探索JavaScript中傳遞太多或太少參數(shù)時如何處理(函數(shù) toArray在后面提到)
function f(x, y) {
console.log(x, y);
console.log(toArray(arguments));
}
多出的參數(shù)將被忽略(可以通過arguments訪問):
> f('a', 'b', 'c')
a b
[ 'a', 'b', 'c' ]
缺少的參數(shù)將會是undefined:
> f('a')
a undefined
[ 'a' ]
> f()
undefined undefined
[]
下面是一個常見模式,給參數(shù)設置默認值:
function pair(x, y) {
x = x || 0; // (*)
y = y || 0;
return [ x, y ];
}
在(*
)這行,如果x是真值(除了:null
,undefined
等),操作符返回x。否則,它返回第二個操作數(shù)。
> pair()
[ 0, 0 ]
> pair(3)
[ 3, 0 ]
> pair(3, 5)
[ 3, 5 ]
如果你想強制參數(shù)的數(shù)量,你可以檢測arguments.length:
function pair(x, y) {
if (arguments.length !== 2) {
throw new Error('Need exactly 2 arguments');
}
...
}
arguments 不是一個數(shù)組,它僅僅是類數(shù)組(array-like):它有一個length屬性,并且你可以通過方括號索引方式訪問它的元素。然而,你不能移除元素,或在它上面調用任何數(shù)組方法。因此,有時你需要將其轉換為數(shù)組。這就是下面函數(shù)的作用。
function toArray(arrayLikeObject) {
return [].slice.call(arrayLikeObject);
}
更多建議: