定义函数的一种方法是通过函数声明:
function add(param1, param2) {
return param1 + param2;
}
前面的代码定义了一个函数,add具有两个参数param1和param2,并返回两个参数的总和。这是您调用该函数的方式:
>加(6,1)
7
>加('a','b')
'ab'
另一种定义方法add()是将函数表达式分配给变量add:
var add = function (param1, param2) {
return param1 + param2;
};
函数表达式产生一个值,因此可以用来直接将函数作为参数传递给其他函数:
someOtherFunction(function (p1, p2) { ... });
功能声明被吊起
函数声明是红旗的全部-moved到当前范围的开始。这使您可以引用稍后声明的函数:
function foo() {
bar(); // OK, bar is hoisted
function bar() {
...
}
}
请注意, var声明也被吊起(请参阅变量被吊起),它们执行的分配不是:
function foo() {
bar(); // Not OK, bar is still undefined
var bar = function () {
// ...
};
}
特殊变量参数
您可以使用任意数量的参数来调用JavaScript中的任何函数;语言永远不会抱怨。但是,它将通过特殊变量使所有参数可用arguments。arguments看起来像一个数组,但没有任何数组方法:
>函数f(){返回参数}
> var args = f('a','b','c');
> args.length
3
> args [0] //读取索引为0的元素
'一种'
参数太多或太少
让我们使用 以下函数探讨在JavaScript中处理的参数过多或过少(该函数toArray()如将参数转换为Array所示):
function f(x, y) {
console.log(x, y);
return toArray(arguments);
}
其他参数将被忽略(除外arguments):
> f('a','b','c')
b
['a','b','c']
缺少参数将获得值undefined:
> f('a')
一个未定义
[ '一种' ]
> f()
未定义未定义
[]
可选参数
以下是为参数分配默认值的常见模式:
function pair(x, y) {
x = x || 0; // (1)
y = y || 0;
return [ x, y ];
}
在线路(1)中,||操作员返回x,如果它是truthy(未null,undefined等)。否则,它返回第二个操作数:
>对()
[0,0]
>一对(3)
[3,0]
>对(3,5)
[3,5]
强制执行
如果你想强制使用Arity(特定数量的参数),您可以检查arguments.length:
function pair(x, y) {
if (arguments.length !== 2) {
throw new Error('Need exactly 2 arguments');
}
...
}
将参数转换为数组
arguments 是不是数组,它只是类似数组的(请参见类似数组的对象和通用方法)。它具有属性length,您可以通过方括号中的索引访问其元素。但是,您不能删除元素或对其调用任何数组方法。因此,有时您需要转换arguments为数组,这是以下函数的作用(在Array-Like Objects和Generic Methods中对此进行了说明):
function toArray(arrayLikeObject) {
return Array.prototype.slice.call(arrayLikeObject);
}