函數(shù)(Functions)

2018-06-15 18:40 更新

定義函數(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ù)聲明提升(Function declarations are hoisted)

函數(shù)聲明會被提升,他們全被移動到當前作用域開始之處。這允許你在函數(shù)聲明之前調用它們:

function foo() {
    bar();  // 沒問題,bar被提升
    function bar() {
        ...
    }
}

注意:雖然變量聲明也會被提升,但賦值的過程不會被提升:

function foo() {
    bar();  // 有問題,bar是undefined
    var bar = function () {
        // ...
    };
}

特殊變量arguments(The special variable arguments)

在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ù)(Too many or too few arguments)

讓我們通過下面的函數(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ù)(Optional parameters)

下面是一個常見模式,給參數(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ù)量(Enforcing an arity)

如果你想強制參數(shù)的數(shù)量,你可以檢測arguments.length:

function pair(x, y) {
    if (arguments.length !== 2) {
        throw new Error('Need exactly 2 arguments');
    }
    ...
}

將arguments 轉換為數(shù)組(Converting arguments to an array)

arguments 不是一個數(shù)組,它僅僅是類數(shù)組(array-like):它有一個length屬性,并且你可以通過方括號索引方式訪問它的元素。然而,你不能移除元素,或在它上面調用任何數(shù)組方法。因此,有時你需要將其轉換為數(shù)組。這就是下面函數(shù)的作用。

function toArray(arrayLikeObject) {
    return [].slice.call(arrayLikeObject);
}

深入閱讀

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號