在for循环中覆盖函数

时间:2012-05-28 16:15:12

标签: javascript openlayers

我正在开发一个OpenLayers应用程序,它对矢量图层进行动态分类。因此,我试图遍历特定数量的专题类(类别),并为内部的每个类定义一个过滤器。

名为 OpenLayers.Filter.Function 的OpenLayers对象表示每个过滤器。每个OpenLayers.Filter.Function都会覆盖OpenLayers类的evaluate()函数。

我的代码如下所示:

var rules = new Array();

for (var i = 0; i < numClasses; i++) {
    filter_x = function() {
    return new OpenLayers.Filter.Function({
            evaluate: function(attributes) {
                // some code to define the filter
                // uses specific values: array[i] & array[i+1
    }
    var rule_x = new OpenLayers.Rule({
        filter: filter_x,
        symbolizer: { fillColor: colors[i],
                    fillOpacity: 0.5, strokeColor: "white"}
    });
    rules.push(rule_x);
}
thematicStyle.addRules(rules);

不幸的是,这不起作用。似乎所有过滤器都执行上一个循环周期的evaluate()函数。

你有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您正在i关闭可变,即对于您的所有规则,i的值将相同最后,即numClasses - 1i是相同的变量,为所有迭代共享。循环体内没有创建副本。

这是正确的方法:

var rules = new Array();

for (var i = 0; i < numClasses; i++) (function (i) {
    filter_x = function() {
    return new OpenLayers.Filter.Function({
            evaluate: function(attributes) {
                // some code to define the filter
                // uses specific values: array[i] & array[i+1
    }
    var rule_x = new OpenLayers.Rule({
        filter: filter_x,
        symbolizer: { fillColor: colors[i],
                    fillOpacity: 0.5, strokeColor: "white"}
    });
    rules.push(rule_x);
})(i);
thematicStyle.addRules(rules);

在Javascript的未来版本中,您可以在for循环中执行let j = i,但就目前而言,您仍然坚持使用这些语义。