2.10 参数命名
函数被传入的参数数量称为元数 (arity),一般来说函数的元数应该尽可能的精简,但还是避免不了出现极多个元数的调用场景。多元数的问题在于每个参数都必须按照先后顺序被传入,即使个别参数是可选的。要记住这些顺序本身就是一个令人头疼的问题,而且给函数传入无用的参数,对功能本身而言也没有意义。
在下面的示例中,createUser()是一个用于创建用户账户的函数,userProto是用户账户的默认配置,可以用createUser()中传入的参数将之覆盖。
var userProto = {
name: '',
email: '',
alias: '',
showInSearch: true,
colorScheme: 'light'
};
function createUser(name, email, alias, showInSearch,
colorScheme) {
return {
name: name || userProto.name,
name: email || userProto.email,
alias: alias || userProto.alias,
showInSearch: showInSearch,
colorScheme: colorScheme || userProto.colorScheme
};
}
test('User account creation', function () {
var newUser = createUser('Tonya', '', '', '', 'dark');
equal(newUser.colorScheme, 'dark',
'colorScheme stored correctly.');
});
在上述示例中,createUser()函数拥有5个可选参数,而UserProto是一个原型对象,这里存在一个问题,先看函数调用:
var newUser = createUser('Tonya', '', '', '', 'dark');
首先,如果不了解createUser()函数的具体实现,很难知晓每个参数的具体含义。其次,若想设置最后一位参数的值,必须将前面4位参数全部补全。再者,如果这个函数被其他模块依赖,那么后期对其所进行参数调整的成本非常昂贵。
正确的参数传入方式是:
var newUser = createUser({
name: 'Mike',
showInSearch: false
});
你可以使用extend()方法来处理这类参数的传入,市面上大部分JavaScript类库中都拥有类似的方法(包括jQuery与Underscore),来看看使用jQuery的版本:
function createUser(options) {
return $.extend({}, userProto, options);
}
$.extend()将对象作为参数传入,所传入的第一个参数是需要进行扩展的对象。在这个例子中,我们需要在不改变userProto或options值的前提下,创建用户账户对象,所有对象的方法与属性都是通过扩展而来,这是一种简单且优雅的代码复用方式。
时间: 2024-10-24 23:21:42