Loop包含块范围的变量

时间:2017-02-28 12:31:57

标签: typescript

我坚持使用这段代码:

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

这正是我的问题,但我无法适应我的代码。 有人可以帮帮我吗?

2 个答案:

答案 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);