阅读(4835) (0)

函数(Functions)

2017-06-15 18:34:40 更新

定义函数的一种方法是通过函数声明:

function add(param1, param2) {
    return param1 + param2;
}

上面的代码定义一个名称叫做add的函数,有两个参数param1和param2,并且返回参数的和。下面是如何调用这个函数:

> add(6, 1)
  7
> add('a', 'b')
  'ab'

另一种定义add()函数的方法是通过函数表达式:

var add = function (param1, param2) {
    return param1 + param2;
};

函数表达式产生一个值,因此可以直接将函数作为参数传递给其他函数:

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

函数声明提升(Function declarations are hoisted)

函数声明会被提升,他们全被移动到当前作用域开始之处。这允许你在函数声明之前调用它们:

function foo() {
    bar();  // 没问题,bar被提升
    function bar() {
        ...
    }
}

注意:虽然变量声明也会被提升,但赋值的过程不会被提升:

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

特殊变量arguments(The special variable arguments)

在JavaScript中你可以调用任意函数并传递任意数量的参数——语言绝不会抱怨(参数检测)。都可以正常工作,然而,使所有参数可访问需要通过特殊变量 arguments。arguments 看起来像数组,但它没有数组的方法(称为类数组 array-like)。

> function f() { return arguments }
> var args = f('a', 'b', 'c');
> args.length
3
> args[0]  // 获取索引为0的元素
'a'

太多或太少参数(Too many or too few arguments)

让我们通过下面的函数探索JavaScript中传递太多或太少参数时如何处理(函数 toArray在后面提到

function f(x, y) {
    console.log(x, y);
    console.log(toArray(arguments));
}

多出的参数将被忽略(可以通过arguments访问):

> f('a', 'b', 'c')
a b
[ 'a', 'b', 'c' ]

缺少的参数将会是undefined:

> f('a')
a undefined
[ 'a' ]
> f()
undefined undefined
[]

可选参数(Optional parameters)

下面是一个常见模式,给参数设置默认值:

function pair(x, y) {
    x = x || 0;  // (*)
    y = y || 0;
    return [ x, y ];
}

在(*)这行,如果x是真值(除了:nullundefined 等),操作符返回x。否则,它返回第二个操作数。

> pair()
[ 0, 0 ]
> pair(3)
[ 3, 0 ]
> pair(3, 5)
[ 3, 5 ] 

强制数量(Enforcing an arity)

如果你想强制参数的数量,你可以检测arguments.length:

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

将arguments 转换为数组(Converting arguments to an array)

arguments 不是一个数组,它仅仅是类数组(array-like):它有一个length属性,并且你可以通过方括号索引方式访问它的元素。然而,你不能移除元素,或在它上面调用任何数组方法。因此,有时你需要将其转换为数组。这就是下面函数的作用。

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

深入阅读