制作函数中所需的参数
Making Params Required in Function
如果一个函数被调用,并且缺少正确执行被调用函数所需的参数,那么抛出错误是否是一种好的做法?
例如(在JavaScript中):
var sayHi = function(name) {
console.log(name + ' says hi!');
}
与。
var sayHi = function(name) {
if(!name) { throw new Error('param is missing'); }
console.log(name + ' says hi!');
}
对于第二个例子是一个好的编码实践,还是它只会增加不必要的膨胀,从而可能导致在一个横跨数十甚至数百个文件的更复杂的程序中经常出现不必要的错误,有强烈的意见吗?
您可以通过es6传递一个函数来实现这一点,该函数会立即抛出一个Error作为默认值
const err = msg => { throw Error( msg ) }
const sayHi = function(name = err('Name is undefined')) {
console.log(name + ' says hi!');
}
这比在函数体中使用if
语句的性能稍好,并提高了可读性。你可以做的另一个想法是构建一个做同样事情的装饰器。类似于:
@required( 'name')
const sayHi = function(name = err('Name is undefined')) {
console.log(name + ' says hi!');
}
正如你在问题Is there a strong opinion
中提到的,答案可能大多是固执己见的,所以在我看来,你应该始终有一个错误处理策略。无论是功能级别还是应用级别。在我看来,错误处理不太可能成为性能瓶颈。
第一件事:
这实际上取决于您决定是否应该使用throw
异常,而不是return
错误代码(或null
,或其他什么)。
据我所知,只要处理得当,抛出异常而不是返回错误并没有什么大问题。
这就引出了以下问题:
何时正确抛出异常(或JS中的错误)?
这个问题非常棘手,这里应该标记并关闭为"主要基于意见",因为这取决于个人意见。。嗯,也许。。
类似的问题(嗯……这个确切的问题)已经在这里被问到并回答了,我发现自己同意公认的答案,总结如下:
没错!当且仅当函数前提条件(关于参数的假设)被破坏时,才会引发异常!–@Lightman
在您的情况下,如果违反了函数(预期参数)的假设:是,则抛出异常,因为JS没有提供任何语法构造来将函数参数设置为required
。
使用ES6,您可以使用
default parameters
强制执行您想要的行为:
function required() {
throw new Error('Missing parameter');
}
function foo(aRequiredParameter = required()) {
// Use your required parameter
console.log("Hello " + aRequiredParameter);
}
// Hence:
foo("World") // OK
foo() // -> Throws exception
示例取自此处,而在此处您可以找到有关此功能的更多示例。
这是可以实现的,因为当aRequiredParameter
未被传递时,它的默认值将被分配(在本例中被调用),因此将抛出异常/错误。
这取决于情况。您几乎应该总是有某种错误处理,但什么类型的处理取决于情况。
有时只是抛出一个错误是可以的,其他时候如果你有错误,你可能想做点什么。
您可以使用类似try/catch的东西,或者,在这种情况下,只检查未定义的内容并使用它做一些事情。
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 函数未将值作为参数传递
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 为什么不'我们在javascript中使用函数参数的数据类型
- 你好,这是测试用例,我必须在函数中传递n个参数
- JavaScript - 多参数函数,它是多个图像库的字符串
- 如何从两个参数函数返回随机整数
- 以无点风格在Ramda中编写一个无参数函数
- JS:将单参数函数转换为可链接函数
- 正则表达式类似于Javascript中的参数函数
- 将 $' 值传递给替换的关联参数函数
- "这个“;在参数函数中
- 如何向jquery插件发送参数函数
- 将参数函数Node.js从一个js传递到另一个js
- 如何在javascript参数函数中传递PHP post方法字符串
- 装饰 Javascript Promise.then 以便参数函数接收附加参数
- 正在分析setInterval ID'是的's参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆