我坚持使用这段代码:
this.unwatches[id] = [];
for (let i: number = 0; i < this.columns.length; i++ ) {
this.unwatches[id].push($scope.$watch((): any => {
return entity[this.columns[i].attribute];
}, (newValue: any): void => {
this.grid.cells(id, i).setValue(newValue);
}));
}
我得到了这个错误:循环包含循环中的函数引用的块范围变量'i'。
我找到了这个帖子:Typescript - closure inside loop
这正是我的问题,但我无法适应我的代码。 有人可以帮帮我吗?
答案 0 :(得分:2)
您需要做的就是使用立即调用的函数表达式捕获i
的值,这有效地为i
创建了一个闭包。例如:
for (let i: number = 0; i < this.columns.length; i++) {
((i) => {
// this.unwatches[id].push ...
})(i);
}
这将在闭包内创建一个新的i
,它与循环中使用的i
不同,并且在闭包的内部范围被垃圾收集之前保持不变。换句话说,&#34;外部&#34; &{34;内部&#34; <{1}}被阴影 i
- 也就是说,内部不能从外部改变,例如通过递增循环计数器,因为它们引用了两个不同的对象。
请注意,为循环中的每次迭代创建一个匿名函数对象,这可能会对您执行大规模循环时的性能产生影响。
答案 1 :(得分:0)
您需要将 var 与 IIFE (立即调用函数表达式)一起使用以在每次迭代时捕获i。 要实现IIFE,您只需将函数包装如下:
(function(i) {
//your function goes here
})(i);