[英]Overwrite function inside a for loop
我正在開發一個OpenLayers應用程序,它可以對矢量層進行動態分類。 因此,我試圖遍歷特定數量的主題類(類別),並為內部的每個類定義一個過濾器。
一個名為OpenLayers.Filter.Function的OpenLayers對象代表每個過濾器。 每個OpenLayers.Filter.Function都會覆蓋OpenLayers類的評價()函數。
我的代碼如下所示:
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);
不幸的是,這不起作用。 似乎所有過濾器都執行最后一個循環的評價()函數。
你有什么想法?
您正在對可變的 i
進行封閉,也就是說,對於所有規則,最后i
的值將相同,即numClasses - 1
。 i
是相同的變量,所有迭代都共享。 在循環體內不會創建任何副本。
這是正確的方法:
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
,但是現在,您仍然受這些語義的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.