我发现C#中的命名参数功能在某些情况下非常有用。
calculateBMI(70, height: 175);
如果要在JavaScript中使用该怎么办?
我不想要的是:
myFunction({ param1: 70, param2: 175 });
function myFunction(params){
// Check if params is an object
// Check if the parameters I need are non-null
// Blah blah
}
我已经使用过这种方法。还有另一种方法吗?
我可以使用任何库来做到这一点。
ES2015及更高版本
在ES2015中, 参数解构可用于模拟命名参数。这将要求调用者传递一个对象,但是如果您还使用默认参数,则可以避免函数内部的所有检查:
myFunction({ param1 : 70, param2 : 175});
function myFunction({param1, param2}={}){
// ...function body...
}
// Or with defaults,
function myFunc({
name = 'Default user',
age = 'N/A'
}={}) {
// ...function body...
}
ES5
有一种方法可以接近您想要的,但它基于[Function.prototype.toString
ES5的输出,该输出在某种程度上取决于实现,因此它可能与跨浏览器不兼容。
想法是从函数的字符串表示形式解析参数名称,以便可以将对象的属性与相应的参数关联。
函数调用可能看起来像
func(a, b, {someArg: ..., someOtherArg: ...});
其中a
和b
是位置参数,最后一个参数是带有命名参数的对象。
例如:
var parameterfy = (function() {
var pattern = /function[^(]*\(([^)]*)\)/;
return function(func) {
// fails horribly for parameterless functions ;)
var args = func.toString().match(pattern)[1].split(/,\s*/);
return function() {
var named_params = arguments[arguments.length - 1];
if (typeof named_params === 'object') {
var params = [].slice.call(arguments, 0, -1);
if (params.length < args.length) {
for (var i = params.length, l = args.length; i < l; i++) {
params.push(named_params[args[i]]);
}
return func.apply(this, params);
}
}
return func.apply(null, arguments);
};
};
}());
您将其用作:
var foo = parameterfy(function(a, b, c) {
console.log('a is ' + a, ' | b is ' + b, ' | c is ' + c);
});
foo(1, 2, 3); // a is 1 | b is 2 | c is 3
foo(1, {b:2, c:3}); // a is 1 | b is 2 | c is 3
foo(1, {c:3}); // a is 1 | b is undefined | c is 3
foo({a: 1, c:3}); // a is 1 | b is undefined | c is 3
这种方法有一些 缺点 (已警告您!):
undefined
(这与根本没有值不同)。这意味着您不能arguments.length
用来测试已传递了多少个参数。除了拥有创建包装器的函数外,您还可以拥有一个接受函数和各种值作为参数的函数,例如
call(func, a, b, {posArg: ... });
甚至扩展,Function.prototype
以便您可以执行以下操作:
foo.execute(a, b, {posArg: ...});
假设我有这样一个类和方法: 是否可以强制编写调用的代码的人显式地为方法调用提供类型见证? 我想做的是在调用方法时总是需要参数。有办法做到这一点吗?我知道我总是可以添加一个参数,但是我正在探索其他选项。
我正在使用@DataProvider使用TestNG 6.14.3Java编写单元测试 我想实现的目标: 我想为每个数据提供程序案例命名 我所尝试的: > 我添加了一个额外的参数并遵循了此指南,问题是现在我在每个我不想要的测试中都有一个未使用的参数。 创建一个忽略第一个参数的自定义数据提供程序注释,这不起作用,因为我找不到将其与TestNG集成的方法。 我的问题: 是否有一种内置的方式为测试用例提
有没有办法在“访问回调”函数中使用Drupal菜单的“页面参数”?我需要同时使用“访问参数”和“访问回调” “页面参数”= “访问参数”= “访问回调”= 在我的“访问回调”方法mymodule_application_page_access中,是否可以使用作为“页面参数”传递的值?
我需要调用一个方法:myMethod(双...选项卡),但我通过其他方法调用获取此数组的元素。现在我做的是: 但是有了它,myMethod是这样声明的: 我想知道如何使用bytebuddy来代替: 或 此外,属性“form”是一个动态检索方法,因此在“for”中执行的循环数永远不会相同。所以有时我可以调用这样的表单方法:或或
我只是用python编程我自己的不和谐机器人,我有一个杀死命令。它所做的只是,当你键入并提到某人()时,它会给你一个随机的场景,告诉你如何杀死他们,类似于Dank Memer机器人。我试图得到提到的用户的ID,这将是函数的第二个参数。但是我被卡住了。在阅读了应用编程接口并多次搜索后,我只得到了如何获取作者的身份并将他们与机器人联系起来的信息,而不是作者提到的那个人。 这是我目前正在使用的代码。其中
函数参数的命名规范,有没有比较详细的介绍文档,对这块老是似懂非懂。