javascript - 为什么这是一个闭包?

标签 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; }
    );
}

维基页面指出这是一个关闭的示例。

这个片段中的闭包在哪里?

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

此外,应该有一些变量的生命周期超出了创建它的函数的范围。

最佳答案

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 包含变量阈值,但没有它的值。我们可以看到,threshold 的值不在 var Threshold 的范围内,它经过修改,这样,如果它在范围内,则下一个警报中的 bool 返回值将不是 false 而是 true;但是,从最初调用 getPastThreshold 函数时起,阈值是静态的。这是由于关闭所致。

关于javascript - 为什么这是一个闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24990442/

相关文章:

javascript - 如何使用包含 id、名称和 javascript 的 jQuery 克隆元素?

javascript - 删除属性显示为 :none via Javascript 的页面上的 div

javascript - 无法将隐藏的 div 对齐以在可见性上垂直和水平显示在页面中心

javascript - 这个 javascript 函数是如何调用的,它使用什么模式?

c# - 处理后的闭包有奇怪的行为

javascript - 单个文档的多个请求和 500000 个文档的单个请求(Cloud Firestore)哪个性能更好?

php - HTML onclick 不触发函数

javascript - 闭包对象的继承和方法的重写

python - 从 Python 中的包装函数获取上下文对象

java - 将对集合中的元素运行方法的所有结果添加到另一个集合