Javascript函数参数的引用

Javascript函数参数的引用,javascript,Javascript,代码来自雄辩的函数式编程。我无法理解测试(元素)。如果测试(元素)引用的是equals(x),那么元素是否为0,因为只有一个参数 function count(test, array) { return reduce(function(total, element) { return total + (test(element) ? 1 : 0); }, 0, array); } function equals(x) { return function

代码来自雄辩的函数式编程。我无法理解测试(元素)。如果测试(元素)引用的是equals(x),那么元素是否为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;
}
函数forEach(数组、动作){
对于(var i=0;i
元素
未从
x
获取其值

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

首先,让我们直接使用
equals
,记住
equals
的计算方法与
equals(0)
的计算方法一样:

但是,因为这有点难以抽象地理解,让我们给闭包起个名字:

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
)是硬编码的,而在闭包中,创建的
等于
它是绑定的
x
变量的计算结果


(有关闭包的更多精彩内容,请参见)

感谢您的解释。我是Javascript新手,我知道闭包需要创建一个变量,就像您所做的“var equalToZero=equals(0)”,但我在代码中没有看到这一点。那么闭包在没有它的情况下是如何工作的呢?函数就是值。您可以像在第一个块中一样直接使用从
equals(0)
返回的函数,或者像在第二个块中一样,存储该函数以供以后使用。在这两种情况下,它仍然是一个闭包/函数-这不会改变。也许认为代码< >(0)(1)< /代码>相当于<代码>(等于(0))(1)< /代码> -即,首先调用“<代码>等于/CODE >(当绑定到<代码> x < /代码>的闭包时),然后调用所得到的函数,直接或赋值给<代码>均衡器0/COD>。(为
元素
提供了一个参数)。
function equalToZero (element) {
    return 0 === element;
}