栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

循环内的JavaScript闭合–简单的实际示例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

循环内的JavaScript闭合–简单的实际示例

嗯,问题在于

i
每个匿名函数中的变量都绑定到函数外部的相同变量。

经典解决方案:封闭

您要做的是将每个函数中的变量绑定到函数外部的一个不变的值:

var funcs = [];function createfunc(i) {  return function() {    console.log("My value: " + i);  };}for (var i = 0; i < 3; i++) {  funcs[i] = createfunc(i);}for (var j = 0; j < 3; j++) {  // and now let's run each one to see  funcs[j]();}

由于Javascript中没有块作用域-只有函数作用域-通过将函数创建包装在新函数中,因此请确保“ i”的值保持预期。


ES5.1解决方案:forEach

随着该

Array.prototype.forEach
功能的使用相对广泛(在2015年),值得注意的是,在那些主要涉及对值数组进行迭代的情况下,
.forEach()
该方法提供了一种干净自然的方法来为每次迭代获取不同的闭包。也就是说,假设您有某种包含值的数组(DOM引用,对象等),并且出现了针对每个元素设置回调的问题,则可以执行以下操作:

var someArray = [  ];// ...someArray.forEach(function(arrayElement) {  // ... pre pre pre for this one element  someAsynchronousFunction(arrayElement, function() {    arrayElement.doSomething();  });});

这个想法是,与

.forEach
循环一起使用的回调函数的每次调用都将是其自己的闭包。传递给该处理程序的参数是特定于迭代的特定步骤的数组元素。如果在异步回调中使用它,它将不会与在迭代其他步骤中建立的任何其他回调发生冲突。

如果您碰巧在jQuery中工作,该

$.each()
函数将为您提供类似的功能。


ES6解决方案:
let

ECMAscript
6(ES6)引入了新的

let
const
关键字,其作用域与
var
基于变量的作用域不同。例如,在
let
基于索引的循环中,循环中的每次迭代都会有一个
i
具有循环范围的新变量,因此您的代码将按预期工作。有很多资源,但是我建议2ality的块定义范围文章作为大量信息来源。

for (let i = 0; i < 3; i++) {  funcs[i] = function() {    console.log("My value: " + i);  };}

但是请注意,IE9-IE11和Edge
14之前的Edge支持,

let
但是出现了上述错误(它们不会
i
每次都创建一个新的,因此上面的所有功能都将记录3,就像我们使用一样
var
)。Edge
14终于正确了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385147.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号