【发布时间】:2016-10-02 08:39:21
【问题描述】:
我正在阅读 Eloquent JS 并希望对这段代码进行澄清:
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
// → 10
我理解闭包的概念,但我坚持的是最后一行调用 twice(5) 的方式。雄辩的 JS 说:
"在示例中,multiplier 返回一个冻结的代码块,该代码块存储在两次变量中。最后一行然后调用此变量中的值,导致冻结代码(返回编号 * 因子;)被激活。它仍然可以从创建它的乘数调用中访问因子变量,此外,它还可以通过其 number 参数访问解冻时传递的参数 5。”
解冻闭包的特性时是否传递了对参数5 的“附加访问”?当两次是变量时,这如何工作?
【问题讨论】:
-
返回的唯一内容是在 return 关键字之后函数的大括号内。
-
@Kunok,不仅如此。它也可以访问
factor。 -
是的,它返回表达式:
number * factor。你可以把它看成一个单一的东西,因为一旦它被执行,它就是一个单一的值,一个表达式的结果。 -
是的,它是闭包的一个特性。即使在外部函数返回之后,闭包也可以访问外部函数的变量。当 JavaScript 中的函数执行时,它们使用与创建它们时相同的作用域链。这意味着即使在外部函数返回之后,内部函数仍然可以访问外部函数的变量。因此,您可以稍后在程序中调用内部函数。在这种情况下,“两次”函数变量可以访问外部函数“乘数”“因子”变量,这是闭包的特征。
-
我不知道这本书,但是“冻结”和“激活”这两个词似乎令人困惑且不标准。
multiplier在调用时只返回一个函数;没有必要将其称为“冻结的代码块”。当该函数被依次调用(使用twice(5))时,没有理由说它是“激活的”;有非常好的术语,例如“执行”、“调用”或“运行”。
标签: javascript function variables closures