雄辩的闭包和函数

eloquent Closure and Functions

本文关键字:函数 闭包      更新时间:2023-09-26

在雄辩的JavaScript中,作者提供了以下示例+散文:

只要稍微修改一下,我们就可以将前面的示例转化为创建与任意数量相乘的函数。

function multiplier(factor) {   
    return function(number) {
        return number * factor;   
    }; 
}
var twice = multiplier(2); 
console.log(twice(5)); 
// → 10 The explicit

不需要wrapValue示例中的localVariable,因为参数本身就是一个局部变量。

思考这样的程序需要一些练习。良好的心理模型是将函数关键字视为"冻结"中的代码它的主体并将其包装到一个包中(函数值)。所以什么时候如果您阅读了返回函数(…){…},请将其视为返回句柄转换为一段计算,冻结以供以后使用。

在本例中,multiplier返回一个冻结的代码块存储在二次变量中。最后一行调用中的值该变量,导致冻结的代码(返回数字*factor;)激活。它仍然可以访问创建它的multiplier调用,此外它还可以访问参数,5时通过其数字参数传递。

javascript如何知道5in:

console.log(twice(5));

假设是数字的值?JavaScript本质上是在对自己说"我已经有2作为因子的值了,我不能改变它,所以5必须是数字的值"。

换句话说,

var twice = multiplier(2)
so twice =  multiplier(2) {return function (number)}
thus twice(5) = multiplier(2) {return function (5)}

这是对的吗?

如果乘法器中还有另一个局部变量,我可以调用:吗

twice(5,10)

javascript会知道这意味着:

factor = 2
number = 5
third variable = 10

ES6版本

const multiplier = factor => {
  return number => number * factor;
}

让我困惑的是,变量"twice"被分配了乘数函数,而不是乘数函数(也是一个函数)的返回

const twice = multiplier(2);

所以实际分配的是:

const twice = number => number * 2
twice(2)
-> 10

可以这样想:

var twice = function(number) {
        return number * 2;   
    }; 

当您调用multiplier(2)时,您正在创建一个新函数,该函数将factor嵌入到该新函数中。

我也被这个问题困扰了一段时间。以下是帮助我点击的内容。

在书的网站上,你可以与页面上的代码进行交互:

https://eloquentjavascript.net/03_functions.html#p_O3ISvGjNhj

我两次尝试从变量中删除参数

function multiplier(factor) {
  return number => number * factor;
}
let twice = multiplier(2);
console.log(twice);

返回的是:数字=>数字*因子

这让我意识到两次被分配了乘数的内部函数。当我不传递参数时,它会返回内部函数本身。当我将一个参数传递给两次时,它将成为该内部函数的参数,并执行它。

所以当我尝试这个:

console.log(twice());

它试图执行函数。它返回NaN,因为我没有为数字传递参数。

所以,当我们这样做时:

let twice = multiplier(2);

我们将变量绑定两次乘数函数的内部函数,并(有效地)传递了一个参数2。

前面的评论更简洁地解释了这个操作,但直到点击这里,它才对我有意义。