函數(shù)(Functions)

2018-06-15 18:40 更新

定義函數(shù)的一種方法是通過函數(shù)聲明:

  1. function add(param1, param2) {
  2. return param1 + param2;
  3. }

上面的代碼定義一個名稱叫做add的函數(shù),有兩個參數(shù)param1和param2,并且返回參數(shù)的和。下面是如何調(diào)用這個函數(shù):

  1. > add(6, 1)
  2. 7
  3. > add('a', 'b')
  4. 'ab'

另一種定義add()函數(shù)的方法是通過函數(shù)表達(dá)式:

  1. var add = function (param1, param2) {
  2. return param1 + param2;
  3. };

函數(shù)表達(dá)式產(chǎn)生一個值,因此可以直接將函數(shù)作為參數(shù)傳遞給其他函數(shù):

  1. someOtherFunction(function (p1, p2) { ... });

函數(shù)聲明提升(Function declarations are hoisted)

函數(shù)聲明會被提升,他們?nèi)灰苿拥疆?dāng)前作用域開始之處。這允許你在函數(shù)聲明之前調(diào)用它們:

  1. function foo() {
  2. bar(); // 沒問題,bar被提升
  3. function bar() {
  4. ...
  5. }
  6. }

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

  1. function foo() {
  2. bar(); // 有問題,bar是undefined
  3. var bar = function () {
  4. // ...
  5. };
  6. }

特殊變量arguments(The special variable arguments)

在JavaScript中你可以調(diào)用任意函數(shù)并傳遞任意數(shù)量的參數(shù)——語言絕不會抱怨(參數(shù)檢測)。都可以正常工作,然而,使所有參數(shù)可訪問需要通過特殊變量 arguments。arguments 看起來像數(shù)組,但它沒有數(shù)組的方法(稱為類數(shù)組 array-like)。

  1. > function f() { return arguments }
  2. > var args = f('a', 'b', 'c');
  3. > args.length
  4. 3
  5. > args[0] // 獲取索引為0的元素
  6. 'a'

太多或太少參數(shù)(Too many or too few arguments)

讓我們通過下面的函數(shù)探索JavaScript中傳遞太多或太少參數(shù)時如何處理(函數(shù) toArray在后面提到

  1. function f(x, y) {
  2. console.log(x, y);
  3. console.log(toArray(arguments));
  4. }

多出的參數(shù)將被忽略(可以通過arguments訪問):

  1. > f('a', 'b', 'c')
  2. a b
  3. [ 'a', 'b', 'c' ]

缺少的參數(shù)將會是undefined:

  1. > f('a')
  2. a undefined
  3. [ 'a' ]
  4. > f()
  5. undefined undefined
  6. []

可選參數(shù)(Optional parameters)

下面是一個常見模式,給參數(shù)設(shè)置默認(rèn)值:

  1. function pair(x, y) {
  2. x = x || 0; // (*)
  3. y = y || 0;
  4. return [ x, y ];
  5. }

在(*)這行,如果x是真值(除了:nullundefined 等),操作符返回x。否則,它返回第二個操作數(shù)。

  1. > pair()
  2. [ 0, 0 ]
  3. > pair(3)
  4. [ 3, 0 ]
  5. > pair(3, 5)
  6. [ 3, 5 ]

強(qiáng)制數(shù)量(Enforcing an arity)

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

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

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

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

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

深入閱讀

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號