函数默认参数值等于不纯函数可以吗?

时间:2019-04-25 08:56:31

标签: javascript

通常,我看到一个函数的默认值为“静态”或“恒定”值,并且不是由另一个函数调用生成的。

我的意思示例:

function test(num = 10) {
  // code ...
}

我有以下示例。 这个设计好还是不好?

function test(num = randomNumber()) {
  // code ...
}

替代方法如下。

function test(num) {
  if (num === undefined) {
    num = randomNumber()
  }
  // code ...
}

2 个答案:

答案 0 :(得分:0)

function test(num = randomNumber()) {
  // code ...
}

function test(num) {
  if (num === undefined) {
    num = randomNumber()
  }
  // code ...
}
即使它们产生相同的结果,

也不相等,因为第一个给出了方法重载的概念 就像您可以在案例中调用test()和test(5)一样,test()仅处理randomNumber()。无论哪种情况,休息都取决于您对纯函数和不纯函数的选择。

答案 1 :(得分:0)

输入

function test(num = randomNumber()) {
  // code ...
}

编码为BabelJS会产生以下结果:

"use strict";

function test(num) {// code ...

  if (num === void 0) {
    num = randomNumber();
  }
}

因此,初始代码和您提供的替代代码几乎等效。如果我们假设浏览器中ES6的正确实现,那只是样式上的事情。在某些非常老旧或非常有限的浏览器中,参数默认值根本无法使用,但这不是将函数调用用作参数默认值的问题。

在极端数据保存模式下,根本不支持ES6,因此,如果您使用OperaMini,则需要确保避免使用ES6功能。在这里您可以看到一个兼容性表:https://kangax.github.io/compat-table/es6/