雄辩的javascript-闭包和函数

雄辩的javascript-闭包和函数,javascript,function,Javascript,Function,在雄辩的JavaScript中,作者提供了以下示例+散文: 只需稍作修改,我们就可以将前面的示例转换为 创建乘以任意数量的函数 不需要wrapValue示例中的localVariable,因为 参数本身是一个局部变量 思考这样的计划需要一些实践。好心肠 模型将函数关键字视为“冻结”中的代码 它的主体并将其包装成一个包(函数值)。那么什么时候 阅读返回函数(…){…},将其视为返回句柄 到一个计算块,冻结以供以后使用 在本例中,乘法器返回一个冻结的代码块,该代码块 存储在两次变量中。最后一行调用中

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

只需稍作修改,我们就可以将前面的示例转换为 创建乘以任意数量的函数

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

思考这样的计划需要一些实践。好心肠 模型将函数关键字视为“冻结”中的代码 它的主体并将其包装成一个包(函数值)。那么什么时候 阅读返回函数(…){…},将其视为返回句柄 到一个计算块,冻结以供以后使用

在本例中,乘法器返回一个冻结的代码块,该代码块 存储在两次变量中。最后一行调用中的值 此变量,导致冻结的代码(返回编号*因子;)为 激活。它仍然可以从 创建它的乘数调用,此外,它还可以访问 参数在通过其number参数解冻它(5)时传递

javascript如何知道中的5:

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
可以这样想:

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

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

ES6版本

const multiplier = factor => {
  return number => number * factor;
}
const twice = multiplier(2);
让我困惑的是,变量“tweep”被赋值为乘数函数,而不是乘数函数(也是一个函数)的返回

因此,实际分配的是:

const twice = number => number * 2

twice(2)
-> 10

我也被困在这个问题上了。以下是帮助我点击的内容

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

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

function multiplier(factor) {
  return number => number * factor;
}

let twice = multiplier(2);
console.log(twice);
返回:number=>number*factor

这帮助我认识到,两次被赋予了乘数的内部功能。当我不传递参数时,它返回内部函数本身。当我将一个参数传递给两次时,它将成为该内部函数的参数,并执行它

所以当我尝试这个:

console.log(twice());
它试图执行该函数。它返回NaN,因为我没有传递number的参数

因此,当我们这样做时:

let twice = multiplier(2);
我们将变量绑定到乘数函数的内部函数,并(有效地)传递一个参数2

前面的评论更简洁地解释了这个操作,但直到点击这个按钮,我才明白它的意义

let twice = multiplier(2);