gpt4 book ai didi

JavaScript:匿名 vs Helper 函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:26:02 25 4
gpt4 key购买 nike

我试图从 Eloquent Javascript 书中理解这种函数式风格的代码:

http://eloquentjavascript.net/chapter6.html#exercise1

当 count() 函数将匿名函数传递给 reduce() 时,代码可以正常工作。但是,如果我将函数分解为辅助函数,则会出现引用错误。

谁能解释为什么 count() 有效而 countHelper() 无效?

var numbers = [1,2,3,0,1,2,3,0]

function forEach(array, action) {
for (var i = 0; i < array.length; i++)
action(array[i]);
}

function reduce(combine, base, array) {
forEach(array, function (element) {
base = combine(base, element);
});
return base;
}

function equals(x) {
return function(element) { return x === element;};
}

function count(test, array) {
return reduce(function(base, element) {
return base + (test(element)?1:0);
}, 0, array);
}

function countHelper(test, array) {
function helper(base, element) {
return base + (test(element)?1:0);
}
return reduce(helper(base, element), 0, array);
}

function countZeroes(array) {
return count(equals(0), array);
}

print(countZeroes(numbers)) // 2

function countZeroesHelper(array) {
return countHelper(equals(0), array);
}

print(countZeroesHelper(numbers)) // ReferenceError: base is not defined

最佳答案

countHelper() 中,当您将参数传递给 reduce() 并将其返回值传递给 reduce(这不是你想要什么),而不是将引用传递给函数,这样 reduce() 就可以在需要时调用函数。你有这个:

function countHelper(test, array) {
function helper(base, element) {
return base + (test(element)?1:0);
}
return reduce(helper(base, element), 0, array);
}

应该是这样的:

function countHelper(test, array) {
function helper(base, element) {
return base + (test(element)?1:0);
}
return reduce(helper, 0, array);
}

注意 reduce() 函数的参数差异。

当你想将一个函数作为参数传递时,你不要在它后面包含括号,因为这只会导致它立即执行并传递执行它的返回值,而不是仅仅传递对函数的引用本身。

这是无类型语言(如 Javascript 允许您在任何参数中传递任何内容)中的常见错误。即使是经验丰富的程序员偶尔也会犯这个错误(包括我自己)。需要理解的重要区别是执行函数与传递函数引用之间的区别。

关于JavaScript:匿名 vs Helper 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com