来自麻省理工学院公开课程的JavaScript示例
JavaScript example from MIT open course
有人可以解释一下它是如何得到 50 的,以及算法是如何工作的。谢谢。
var multipliers = function makeMultipliers (max) {
var result = [];
for (var i = 0; i < max; i++)
result.push (function (x) {return x * i;});
return result;
}
multipliers(10) [2] (5)
???
价值是什么?
50,而不是 5
你能解决它吗?
来源:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-170-software-studio-spring-2013/lecture-notes/MIT6_170S13_35-java-fn-cls.pdf
第 30 页
这是一个范围问题。到调用最后一个函数时,i
是最后一次在该作用域看到它的位置,即 10。您可以通过关闭来防止这种情况。
function multipliers(max){
var a = [];
for(var i=0; i<max; i++){
(function(i){
a.push(function(x){return x*i});
})(i);
}
return a;
}
在这种情况下,闭包是一个自执行函数,它在循环的每一步都限定i
范围。如果没有发生这种情况,则范围将转到multipliers
函数本身。由于在您调用5
传递到的函数时,循环已经完成,该函数恰好位于multipliers
返回的数组的第 2
步,因此i
已经到达10
。显然,10*5 是 50。当使用闭包时i
最后一个位置2
在其所在的范围内,从而为您提供所寻求的结果。5*2 = 10。
console.log(multipliers(10)[2](5));
这段代码创建了一个函数数组,这些函数将错误地全部引用i
的最终值,但旨在冻结每次迭代期间i
的值。
要修复它,您只需通过嵌入一个新的局部变量来冻结另一个函数中的i
值,从而为迭代变量添加一定程度的局部性。例如,在现有局部变量下方,i
作为参数传递到虚拟函数中,并且该时刻的i
值被冻结到新的局部变量i
中,该变量独立于原始i
,并且不会因原始i
的后续迭代而更改。
result.push (function (x) {return x * i;})
result.push((function(i) {
return function (x) {return x * i;};
})(i));
相关文章:
- 我无法编写或找到一个JavaScript示例,该示例将显示在我的任何浏览器中
- 来自麻省理工学院公开课程的JavaScript示例
- 在几个关于fopen的网站上找到的Javascript示例对我不起作用
- Objective-C 方法/函数调用.(来自JavaScript示例)
- 复制并粘贴Microsoft Javascript示例以检查单元格中的值,但无法正常工作
- javascript示例代码无法运行
- Kurento Media Server HelloWorld Javascript示例webSocket错误
- Instagram API Javascript示例不工作
- 冗长的javascript示例和字符串在属性中的用法
- 基本的Vanilla Javascript示例不起作用
- 谷歌云存储-尝试javascript示例时出错
- Google Analytics报告API V3 javascript示例
- 从网页中删除.htm的javascript示例
- Bigcommerce遗留API验证javascript示例
- RethinkDB:基本JavaScript示例的问题
- 将参数传递给Go IIFE(以下javascript示例)
- 新的FQL多查询在图API Javascript示例
- 名称空间树的javascript示例和语法解释
- 在 JavaScript 示例中使用 bind、apply 或调用
- 你能解释一下这两个javascript示例吗