Javascript 使函数中需要参数

Javascript 使函数中需要参数,javascript,performance,function,error-handling,parameter-passing,Javascript,Performance,Function,Error Handling,Parameter Passing,如果函数被调用并且缺少正确执行被调用函数所必需的参数,则抛出错误是否是一种良好的做法 例如,在JavaScript中: var sayHi = function(name) { console.log(name + ' says hi!'); } vs 对于第二个示例是否是一种良好的编码实践,或者它是否只是增加了不必要的膨胀,这可能导致在一个跨越数十个甚至数百个文件的更复杂程序中经常抛出不必要的错误,是否有强烈的意见?通过es6传递一个函数,可以实现这一点,该函数会立即抛出错误,如默认值

如果函数被调用并且缺少正确执行被调用函数所必需的参数,则抛出错误是否是一种良好的做法

例如,在JavaScript中:

var sayHi = function(name) {
  console.log(name + ' says hi!');
}
vs


对于第二个示例是否是一种良好的编码实践,或者它是否只是增加了不必要的膨胀,这可能导致在一个跨越数十个甚至数百个文件的更复杂程序中经常抛出不必要的错误,是否有强烈的意见?

通过es6传递一个函数,可以实现这一点,该函数会立即抛出错误,如默认值

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!');
}

正如您在问题中提到的,是否有强烈的意见,答案只能是大多数自以为是的,因此在我看来,您应该始终有一个错误处理策略。在功能控制杆或应用程序级别。在我看来,错误处理不太可能成为性能瓶颈

您可以通过es6传递一个函数来实现这一点,该函数将立即抛出一个错误作为默认值

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!');
}

正如您在问题中提到的,是否有强烈的意见,答案只能是大多数自以为是的,因此在我看来,您应该始终有一个错误处理策略。在功能控制杆或应用程序级别。在我看来,错误处理不太可能成为性能瓶颈

视情况而定。您几乎应该总是有某种类型的错误处理,但是什么类型的处理取决于具体情况

有时仅仅抛出一个错误是可以的,其他时候如果你有错误,你可能想做一些事情


您可以使用诸如try/catch之类的方法,或者,在本例中,只需检查未定义的内容,然后对其进行处理。

这取决于具体情况。您几乎应该总是有某种类型的错误处理,但是什么类型的处理取决于具体情况

有时仅仅抛出一个错误是可以的,其他时候如果你有错误,你可能想做一些事情

您可以使用诸如try/catch之类的工具,或者,在这种情况下,只需检查未定义的内容,然后对其进行处理。

第一件事:

这实际上是由您决定是否应该抛出异常,而不是返回错误代码或null,或者其他什么

据我所知,只要处理得当,抛出异常而不是返回错误并没有什么大问题

这导致了以下问题:

在JS中何时抛出异常或错误是正确的

这个问题相当棘手,这里应该标记并关闭为主要基于观点,因为这取决于个人观点。。嗯,也许

一个类似的问题。。这个确切的问题已经被问到并回答了,我发现自己同意接受的答案,总结在这篇评论中:

没错!当且仅当有关参数的函数先决条件假设被破坏时,才会引发异常@莱特曼

在您的情况下,如果函数的假设违反了预期参数:是的,抛出一个异常,因为JS没有提供任何语法构造来根据需要设置函数参数

使用ES6,您可以使用默认参数强制执行您想要的行为:

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
示例取自,而您可以找到有关此功能的更多示例

这是可以实现的,因为当未传递RequiredParameter时,将在这种情况下调用其默认值,因此将抛出异常/错误。

首先:

这实际上是由您决定是否应该抛出异常,而不是返回错误代码或null,或者其他什么

据我所知,只要处理得当,抛出异常而不是返回错误并没有什么大问题

这导致了以下问题:

在JS中何时抛出异常或错误是正确的

这个问题相当棘手,这里应该标记并关闭为主要基于观点,因为这取决于个人观点。。嗯,也许

一个类似的问题。。这个确切的问题已经被问到并回答了,我发现自己同意接受的答案,总结在这篇评论中:

没错!当且仅当有关参数的函数先决条件假设被破坏时,才会引发异常@莱特曼

在您的情况下,如果函数的假设违反了预期参数:是的,抛出一个异常,因为JS不提供任何语法c onstruct根据需要设置函数参数

使用ES6,您可以使用默认参数强制执行您想要的行为:

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
示例取自,而您可以找到有关此功能的更多示例


这是可以实现的,因为当未传递RequiredParameter时,它的默认值将在本例中被指定,因此将引发异常/错误。

这完全取决于意见。我倾向于不包括这样的检查,因为它们会减慢我的代码,让程序员有责任正确调用它们的函数。或者,您也可以使用静态类型语言,例如确保始终使用正确数量的参数调用函数。@raiti13如果某些答案有助于您,请接受它以向未来用户提供帮助:这完全取决于您的意见。我倾向于不包括这样的检查,因为它们会减慢我的代码,让程序员有责任正确调用它们的函数。或者,您也可以使用静态类型语言,例如确保始终使用正确数量的参数调用函数。@raiti13如果某些答案对您有所帮助,请接受它以向未来用户提供帮助:这并不能回答问题。这只是OP已经在做的一种方便的方法。他们会问,如果没有给出参数,是否应该抛出错误。@MikeC将其作为默认参数,而不是在函数体内部进行检查,可以提高性能,并使代码更具可读性。。。因此,我认为这与问题并非毫无关系。不管怎么说,谢谢你的否决票,只是没有。该检查仍在某处执行,如果您正在执行,则会直接转换为类似于OP发布的检查。当前的ES6实现,尤其是对于默认参数,效率不高。向我展示这在当前ES6环境中更快的证据。此外,这同样不能解决实际问题,即在这种情况下,什么是最佳实践?@MikeC嗯,是的,我同意,如果你将代码传输到ES5,当然没有区别。但是如果你不使用它的原生检查和js检查,这并不能回答问题。这只是OP已经在做的一种方便的方法。他们会问,如果没有给出参数,是否应该抛出错误。@MikeC将其作为默认参数,而不是在函数体内部进行检查,可以提高性能,并使代码更具可读性。。。因此,我认为这与问题并非毫无关系。不管怎么说,谢谢你的否决票,只是没有。该检查仍在某处执行,如果您正在执行,则会直接转换为类似于OP发布的检查。当前的ES6实现,尤其是对于默认参数,效率不高。向我展示这在当前ES6环境中更快的证据。此外,这同样不能解决实际问题,即在这种情况下,什么是最佳实践?@MikeC嗯,是的,我同意,如果你将代码传输到ES5,当然没有区别。但如果你不知道它的原生检查与js检查。