【发布时间】:2023-03-21 16:21:01
【问题描述】:
我对 javascript 开发有了更多的了解,并希望确保我遵循流行的约定。 目前,我有一个库,其中包含可以传递给 1 个模型或多个模型的函数。
鉴于一些 javascript 库非常流行,我很好奇;我是否会通过实现我的“单项或列表”要求、枚举参数变量或允许其中一个参数成为数组来符合“事实上的标准”?
场景 1:参数枚举
// passing a single entity to my function
sendMail( email, recipient1 );
// passing multiple entities to my function
sendMail( email, recipient1, recipient2 );
场景 2:实体参数要么是单个实例,要么是数组
// pass a single entity
sendMail( email, recipient1 );
// passing multiple entities
sendMail( email, [recipient1, recipient2] );
我已经看到使用“场景 2”的 jQuery 领域,但我仍然想问 - 哪种方法最流行,为什么?
谢谢
[编辑]
一些 cmets 遵循相同的思路,使用参数对象 - 类似于“场景 2” - 但我觉得它引入了不必要的复杂性 - 不需要命名元素,因为它们只是一个变量长度列表。我想我会在这里补充一下,以防我的问题不够清楚。
[编辑]
我通过 jQuery-1-7.js 看到这样的代码
queue: function( elem, type, data ) {
var q;
if ( elem ) {
type = ( type || "fx" ) + "queue";
q = jQuery._data( elem, type );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
if ( !q || jQuery.isArray(data) ) {
q = jQuery._data( elem, type, jQuery.makeArray(data) );
} else {
q.push( data );
}
}
return q || [];
}
}
[编辑]
在与 JP 讨论后,我想出了这个 - 我并不是说这是正确的选择,但它非常灵活......
lastArgumentAsParams: function()
{
var callerArgs = jQuery.makeArray(this.lastArgumentAsParams.caller.arguments);
// return empty set if caller has no arguments
if ( callerArgs.length == 0 )
return [];
callerArgs.splice(0, callerArgs.length - 1)
// remove all but the last argument
if ( callerArgs.length == 1 && jQuery.isArray(callerArgs[0]))
return callerArgs[0];
else
return callerArgs;
}
如果您在任何函数的开头调用此函数 - 它会将调用者中的最后一个 arg 视为“可变长度参数” - 支持任何约定。
比如我可以这样用
function sendEmail( body, recipients )
{
recipients = lastArgumentAsParams();
// foreach( recipient in recipients )...
}
现在,我可以通过以下任何一种方式调用“sendEmail”,它会按预期工作
sendEmail('hello world', "bill@microsoft.com" );
sendEmail('hello world', "bill@microsoft.com", "steve@apple.com" );
sendEmail('hello world', ["bill@microsoft.com", "steve@apple.com"] );
【问题讨论】:
-
注意:再次强调:您所说的“参数对象”与我的回答和 Uzi 的回答都不同。
-
我已经编辑了我的答案,希望能消除困惑。
-
如果我们不将命名对象模式与可变长度列表混淆,我会更喜欢。可变长度列表让我想到了诸如 printf 之类的东西,它可以接受任意数量的参数,而关键字参数非常适合可选参数和可以更改顺序的参数。无论如何,如果 JS 像 Python 一样,你可以混合和匹配两种风格,那可能是最好的。
-
@missingno - 我完全同意,这两者是完全不同的概念。我将命名对象视为“可选参数”,其中每个参数都由函数代码显式引用,可以是不同的类型,并且具有完全不同的语义。可变长度列表通常由函数代码通过某种循环引用,其中每个项目都应共享相同的基本模式,并且在语义上被视为相同。