gpt4 book ai didi

Javascript 函数参数通过引用

转载 作者:行者123 更新时间:2023-11-30 05:39:21 24 4
gpt4 key购买 nike

代码来自 Eloquent Functional Programming。我无法理解测试(元素)。如果 test(element) 引用 equals(x),那么 element = 0 因为只有一个参数?

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

function equals(x) {
return function(element) {return x === element;}; // element gets value from x?
}

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

上一个代码

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

function reduce(counter, base, array) {
var total = 0;
forEach(array, function (element) {
total += counter(element);
});
return total;
}

最佳答案

元素 x 获取它的值。

相反,元素 指的是一个参数,它会在函数被调用时提供它的值 - 在本例中为 count。变量 xouter 作用域中的一个参数,绑定(bind)在调用 equals 时返回的函数/闭包的作用域中。也就是说,equals(0) 计算一个函数/闭包,然后将其用作 count 的谓词。

首先,让我们直接使用 equals,请记住 equalsequals(0) 一样求值为函数:

   equals(0)(1) // -> false, x=0, element=1
equals(0)(0) // -> true, x=0, element=0
// ^^^^^^^^^ - invokes equals(..), evaluates to the closure binding `x`
// ^^^ - invokes the previously returned closure, supplying `element`

但是因为这有点难以抽象地看到,让我们给闭包一个名字:

var equalToZero = equals(0)  // -> function, x=0
// ^^^^^^^^^ - invokes equals(..), evaluates to the closure binding `x`
equalToZero(1) // -> false, x=0, element=1
equalToZero(0) // -> true, x=0, element=0
// ^^^^^^^^^^^^^^ - invokes the previously returned closure, supplying `element`

// And just as before, it is the `count` function that
// supplies the `element` argument when it invokes the function.
// (The function is locally known by the name `equalToZero`.)
count(equalToZero, array);

我们可以想象是这样写的:

function equalToZero (element) {
return 0 === element;
}

当然,不同之处在于,在上面的函数中,值 (0) 是硬编码的,而在创建闭包的 equals 中,它是任何绑定(bind) x 变量的计算结果为。

(有关闭包的更多优点,请参阅 How do JavaScript closures work?)

关于Javascript 函数参数通过引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653527/

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