在雄辩的JavaScript中,作者提供了以下示例+散文:
稍作修改后,我们可以将上一个示例转变为一种方式 创建乘以任意数量的函数。
function multiplier(factor) {
return function(number) {
return number * factor;
};
}
var twice = multiplier(2);
console.log(twice(5));
// → 10 The explicit
从p开始,不需要来自wrapValue示例的localVariable 参数本身就是一个局部变量。考虑这样的程序需要一些练习。好心理 model是将函数关键字视为“冻结”代码 它的主体并将其包装成一个包(函数值)。所以当 你读取返回函数(...){...},把它想象成返回一个句柄 一段计算,冻结以供以后使用。
在该示例中,乘数返回一个冻结的代码块 存储在两次变量中。最后一行然后调用值 这个变量导致冻结的代码(返回数*因子;) 活性。它仍然可以访问因子变量 创建它的乘数调用,此外它可以访问 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
答案 0 :(得分:1)
将其视为:
var twice = function(number) {
return number * 2;
};
当您调用乘数(2)时,您正在创建一个将因子嵌入到该新函数中的新函数。
答案 1 :(得分:1)
我在这个问题上也停留了一段时间。这就是它帮助我点击的原因。
在该书的网站上,您可以与页面上的代码进行交互:
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 ,因为我没有传递 number 的参数。
所以,当我们这样做时:
let twice = multiplier(2);
我们将变量两次绑定到乘数函数的内部函数,并有效地传递了2个参数。
先前的评论更简洁地解释了此操作,但是直到单击此按钮,对我而言才有意义。
答案 2 :(得分:0)
ES6 VERSION
child(child_here)
困惑我的部分是认为变量'two'被分配了乘数函数,而不是乘数函数的 return (也是函数)。
const multiplier = factor => {
return number => number * factor;
}
所以实际分配的是:
const twice = multiplier(2);