【问题标题】:Additional arguments for functions assigned to variables in Javascript closures分配给 Javascript 闭包中变量的函数的附加参数
【发布时间】: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


【解决方案1】:

如果你命名内部函数并在 devtools 中进行检查,它应该更有意义。

function multiplier(factor) {
  return function innerMultiplier(number) {
    return number * factor;
  }
}

当分配给两次乘数时,调用返回内部函数 因为 javascript 具有一流的功能,所以它们可以被传递并且 通过引用分配给变量

var twice = multiplier(2)

现在innerMultiplier 已分配给twice 变量,但它仍然是一个可以调用的函数。

当您运行 twice(5) 时,您正在调用 innerMultiplier,而 factor 锁定在它的闭包中

这就是所谓的currying部分应用程序

【讨论】:

  • 这只是柯里化,不是部分应用。部分应用仅在 const mul = (x, y) => x * y 等多参数函数的上下文中才有意义。
  • 命名内部函数有很大帮助。谢谢@synthet1c。
【解决方案2】:

一开始我也对这种语法感到困惑,但不要害怕! “两次”变量只是分配给称为闭包的特殊类型的函数,它可以访问包含函数的范围、全局范围和它自己的变量。但我不认为这是混乱的真正根源,这只是你如何称呼闭包。

为了更好地理解,我将简单地 console.log() 你的“两次”变量。你会看到它看起来就像一个普通的函数:

function (number) { 
       return number * factor;
}

就像我上面提到的,两次(2)将返回 4,因为“因子”在包含范围内,它恰好是乘数函数,并且值为 2。在您的问题中,两次变量实际上是完全没有必要

console.log(multiplier(2)(2));

希望这有助于解决问题!

【讨论】:

  • 非常感谢@splay。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2016-04-22
相关资源
最近更新 更多