为什么这是关闭?

时间:2014-07-28 07:32:16

标签: javascript closures

我从此wiki

获取了此代码段
// Return a list of all books with at least 'threshold' copies sold.
function bestSellingBooks(threshold) {
  return bookList.filter(
      function (book) { return book.sales >= threshold; }
    );
}

wiki页面说明这是关闭的一个例子。

这个片段的封闭位置在哪里?

据我所知,闭包包含两个关键属性,一个返回的函数和一个创建该函数的环境。

此外,还有一些变量比创建它的函数的范围更长。

2 个答案:

答案 0 :(得分:0)

DEMO

我已经简化了代码,试图让概念更清晰。

var threshold = 50;
var retVal = getPastThreshold(threshold);
threshold = 1;
alert(retVal);

function useFunction(someFunction) {
    alert(someFunction);
    return someFunction(40);
}

// Returns true if number is past 'threshold'.
function getPastThreshold(threshold) {
  return useFunction( function (someNumber) { return someNumber >= threshold; });
}

您可以从警报中看到传递的函数someFunction包含变量阈值但没有值。我们可以看到阈值的值没有从var阈值作为范围,var阈值被修改,以便,如果它在范围内,下一个警报中的布尔返回值将不是false而是true;但是,从最初调用函数getPastThreshold时,阈值的值是静态的。这是由于关闭。

答案 1 :(得分:0)

threshold在函数bestSellingBooks中定义为参数,并在函数function (book) { return book.sales >= threshold; }中使用(该函数未重新定义)。根据定义,这是闭包。