在我看来,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] 删除。
我来说两句