雄辩的闭包和函数
eloquent Closure and Functions
在雄辩的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。
前面的评论更简洁地解释了这个操作,但直到点击这里,它才对我有意义。
- 构造函数函数闭包变量
- var 函数名称与函数闭包中的名称分配
- 函数闭包
- 何时使用自包含函数(闭包),何时不使用自包含函数
- 避免在 JavaScript 中使用函数闭包
- 难以理解Javascript嵌套函数/闭包
- 在 Javascript 中优化函数闭包的使用有多大价值
- 调用超级构造函数(闭包编译器和库)
- 如何从浏览器控制台访问存储在函数闭包中的 javascript 变量
- 如何在 javascript 中访问父函数闭包
- 函数闭包中的另一个jQuery版本
- jquery对象文字函数/闭包-缺少一些明显的东西
- 这两个使用父类的函数闭包有什么区别吗?
- JavaScript自调用函数闭包不能正常工作
- 改变“;var”;在创建新实例的构造函数闭包内部
- 函数闭包显示外部函数的变量
- 如何使用jsdoc-toolkit记录匿名函数(闭包)
- .prototype不允许在函数闭包中使用
- 自调用匿名函数闭包内变量的生命周期
- 多个文件上的相同函数闭包