关于使用arguments对象创建可变函数的有效JavaScript示例中是否存在错误?

依云

在我看来,Effective JavaScript中有一个示例似乎不正确。它是关于“使用参数创建可变函数”。从书中:

一条很好的经验法则是,每当您提供可变对数函数以方便使用时,还应该提供带有明确数组的固定art-arty版本

因此,这里是计算平均值的示例:

固定版本:

function averageOfArrays(a) {
    for (var i = 0, sum = 0, n = a.length; i < n; i++) {
        sum += a[i];
    }
    return sum / n;
}

可变参数版本:

function average() {
    for (var i = 0, sum = 0, n = arguments.length; i < n; i++) {
        sum += arguments[i];
    }
    return sum / n;
}

可变参数版本作为包装,委派给固定版本的版本:

function average() {
    return averageOfArray(arguments);
}

最后一个版本应该很方便,因为用户可以输入值列表或作为值数组的单个参数。我看不到这对于值数组如何工作。当我打电话时

average([1,2,3]) 

我得到NaN。

这个包装器版本是错误的,对吧?如果是这样,这本书在这个例子上是错误的,我不需要进一步解释。

戴维·朗格

正如其他评论者所指出的那样,想法并不是功能

function average() {
    return averageOfArray(arguments);
}

涵盖了数组和可变参数的情况。正如您所观察到的,该函数不适用于数组参数,也并非旨在。

取而代之的是,您编写了固定对数函数(averageOfArray),然后average基本上“免费”获得了可变参数函数()(如上所述)。

然后,您的图书馆的用户会致电average(1, 2, 3)averageOfArray([1, 2, 3])根据自己的喜好拨打电话,但这并非旨在使用户能够打电话average([1, 2, 3])

您的困惑是有道理的,因为这本书确实将其混为一谈,特别是在此段落中:“一个好的经验法则是,每当您提供可变对数函数以方便使用时,您还应该提供一个固定对数版本,一个显式数组。[*see below]通常很容易提供,因为您通常可以将可变参数函数实现为一个小的包装器,将其委派给固定对等版本。”

上面突出显示的“ this”似乎是指固定的arar函数;换句话说,它表示您从可变对数函数中“免费”获得了固定对数版本。但是,实际上,正如上面的示例所示,正如上面引用中的第二句话所准确描述的,事实恰恰相反。在实现固定对等版本之后,您可以“免费”获得可变对等版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

错误:使用onCall的响应在Firebase函数上不是有效的JSON对象

来自分类Dev

通过简单对象定义JavaScript对象原型是否有效-我可以使用这种语法吗?

来自分类Dev

如何有效地检查Javascript“字典”对象中是否存在键值对

来自分类Dev

如何有效地检测JavaScript中对象的任何键的存在?

来自分类Dev

是否可以从Dart定义有效的JavaScript函数?

来自分类Dev

检查对象是否存在并在Rails中设置等于的有效方法

来自分类Dev

检查整数在PHP中是否有效的函数

来自分类Dev

修改const对象的可变成员是否有效?

来自分类Dev

使用对象文字表示法创建对象的有效Javascript语法是什么?

来自分类Dev

对D中的可变和不变对象均有效的方法

来自分类Dev

Haskell错误使函数确定输入的日期是否有效

来自分类Dev

使用javascript中的对象数组进行排序或插入会更有效吗?

来自分类Dev

是否存在使用mdnsjava的有效网络服务发现示例?

来自分类Dev

在没有属性名称的javascript对象中定义函数是否有效

来自分类Dev

在C ++ Builder中是否有一个有效的COM事件处理示例?

来自分类Dev

在以下“ then”函数中取消$ timeout是否有效?

来自分类Dev

使用JavaScript对象构建菜单的最有效方法

来自分类Dev

使用内置函数从整数创建有效时间

来自分类Dev

如何检查代理在JavaScript中是否有效

来自分类Dev

错误:使用onCall的响应在Firebase函数上不是有效的JSON对象

来自分类Dev

检查DataReader中是否存在列的有效方法

来自分类Dev

关于Java中break语句的有效使用

来自分类Dev

Haskell错误使函数确定输入的日期是否有效

来自分类Dev

ePassport问题导致在Java / Clojure的ICAO 9303“有效示例”中创建MAC

来自分类Dev

使用公用的空函数而不是在每个类实例中创建一个新的空函数是否更有效?

来自分类Dev

检查 PHP 7 中是否存在对象值的最有效方法

来自分类Dev

使用 JavaScript 检查文本输入模式是否有效

来自分类Dev

在 promise 构造函数中解析 promise 是否有效?

来自分类Dev

在事件侦听器中设置的参数化函数调用背后是否存在有效目的?

Related 相关文章

  1. 1

    错误:使用onCall的响应在Firebase函数上不是有效的JSON对象

  2. 2

    通过简单对象定义JavaScript对象原型是否有效-我可以使用这种语法吗?

  3. 3

    如何有效地检查Javascript“字典”对象中是否存在键值对

  4. 4

    如何有效地检测JavaScript中对象的任何键的存在?

  5. 5

    是否可以从Dart定义有效的JavaScript函数?

  6. 6

    检查对象是否存在并在Rails中设置等于的有效方法

  7. 7

    检查整数在PHP中是否有效的函数

  8. 8

    修改const对象的可变成员是否有效?

  9. 9

    使用对象文字表示法创建对象的有效Javascript语法是什么?

  10. 10

    对D中的可变和不变对象均有效的方法

  11. 11

    Haskell错误使函数确定输入的日期是否有效

  12. 12

    使用javascript中的对象数组进行排序或插入会更有效吗?

  13. 13

    是否存在使用mdnsjava的有效网络服务发现示例?

  14. 14

    在没有属性名称的javascript对象中定义函数是否有效

  15. 15

    在C ++ Builder中是否有一个有效的COM事件处理示例?

  16. 16

    在以下“ then”函数中取消$ timeout是否有效?

  17. 17

    使用JavaScript对象构建菜单的最有效方法

  18. 18

    使用内置函数从整数创建有效时间

  19. 19

    如何检查代理在JavaScript中是否有效

  20. 20

    错误:使用onCall的响应在Firebase函数上不是有效的JSON对象

  21. 21

    检查DataReader中是否存在列的有效方法

  22. 22

    关于Java中break语句的有效使用

  23. 23

    Haskell错误使函数确定输入的日期是否有效

  24. 24

    ePassport问题导致在Java / Clojure的ICAO 9303“有效示例”中创建MAC

  25. 25

    使用公用的空函数而不是在每个类实例中创建一个新的空函数是否更有效?

  26. 26

    检查 PHP 7 中是否存在对象值的最有效方法

  27. 27

    使用 JavaScript 检查文本输入模式是否有效

  28. 28

    在 promise 构造函数中解析 promise 是否有效?

  29. 29

    在事件侦听器中设置的参数化函数调用背后是否存在有效目的?

热门标签

归档