Javascript 在匿名函数中给变量赋值
Javascript assign value of variable inside anonymous function
我正在尝试为 OpenLayers 创建多个图层。我循环遍历数组并使用 typename: 'Test:' + item.ServiceName
为每个值分配值。问题是,当 OpenLayer 调用函数时,它会获取 item.ServiceName 的最后一个赋值,它始终是 "Test_Layer_3",因此 Test_Layer_1 和 Test_Layer_2 不会被使用。
如何更改它以便将 Test_Layer_1、Test_Layer_2、Test_Layer_3 分配给 typename?
var _MyLayers = [];
_MyLayers.push({ "Id": 0, "ServiceName": "Test_Layer_1" });
_MyLayers.push({ "Id": 1, "ServiceName": "Test_Layer_2" });
_MyLayers.push({ "Id": 2, "ServiceName": "Test_Layer_3" });
for (var i = 0; i < _MyLayers.length; i++)
{
var item = _MyLayers[i];
var sourceVector = new ol.source.Vector({
loader: function (extent)
{
$.ajax('http://localhost/geoserver/wfs', {
type: 'GET',
data: {
service: 'WFS',
version: '1.1.0',
request: 'GetFeature',
typename: 'Test:' + item.ServiceName,
srsname: 'EPSG:3857',
outputFormat: 'application/json',
bbox: extent.join(',') + ',EPSG:3857'
}
});
},
strategy: ol.loadingstrategy.tile(new ol.tilegrid.createXYZ({})),
});
var layerVector = new ol.layer.Vector({
source: sourceVector,
minResolution: 0,
maxResolution: 2,
style: new ol.style.Style({ stroke: new ol.style.Stroke({ color: "rgba(25, 163, 255, 1.5)", width: 1 }) })
});
_MapLayers.push(layerVector);
}
将 item.ServiceName
替换为 _MyLayers[i].ServiceName
即可。
说明
当您定义 loader
函数时,并不意味着 item.ServiceName
在那一刻被分配给 typename
。相反,该函数为您的 item
变量(某种程度上)维护一个 link,然后 link 返回到 _MyLayers[i]
的值——一个全局变量。
当 OpenLayers 为每个对象调用 loader
函数时,'Test:' + item.ServiceName,
被评估并分配给 typename
,其中 item
表示的值已经改变。它现在将指向最后一项(例如 _MyLayers[3]
),因为它是分配的最后一个值 item
。
通过替换上面的行,loader
函数现在每个维护一个唯一的 link 直接到全局 _MyLayers
。由于 i
是一个数字,因此每个加载程序函数都会根据 i
的值在 for
循环中定义该函数时实现一个语句(例如 _MyLayers[1]
,_MyLayers[2]
, ...等等)。
我最终将 item.ServiceName
的值分配给了 sourceVector。然后在loader函数中读取sourceVector的值。
我正在尝试为 OpenLayers 创建多个图层。我循环遍历数组并使用 typename: 'Test:' + item.ServiceName
为每个值分配值。问题是,当 OpenLayer 调用函数时,它会获取 item.ServiceName 的最后一个赋值,它始终是 "Test_Layer_3",因此 Test_Layer_1 和 Test_Layer_2 不会被使用。
如何更改它以便将 Test_Layer_1、Test_Layer_2、Test_Layer_3 分配给 typename?
var _MyLayers = [];
_MyLayers.push({ "Id": 0, "ServiceName": "Test_Layer_1" });
_MyLayers.push({ "Id": 1, "ServiceName": "Test_Layer_2" });
_MyLayers.push({ "Id": 2, "ServiceName": "Test_Layer_3" });
for (var i = 0; i < _MyLayers.length; i++)
{
var item = _MyLayers[i];
var sourceVector = new ol.source.Vector({
loader: function (extent)
{
$.ajax('http://localhost/geoserver/wfs', {
type: 'GET',
data: {
service: 'WFS',
version: '1.1.0',
request: 'GetFeature',
typename: 'Test:' + item.ServiceName,
srsname: 'EPSG:3857',
outputFormat: 'application/json',
bbox: extent.join(',') + ',EPSG:3857'
}
});
},
strategy: ol.loadingstrategy.tile(new ol.tilegrid.createXYZ({})),
});
var layerVector = new ol.layer.Vector({
source: sourceVector,
minResolution: 0,
maxResolution: 2,
style: new ol.style.Style({ stroke: new ol.style.Stroke({ color: "rgba(25, 163, 255, 1.5)", width: 1 }) })
});
_MapLayers.push(layerVector);
}
将 item.ServiceName
替换为 _MyLayers[i].ServiceName
即可。
说明
当您定义 loader
函数时,并不意味着 item.ServiceName
在那一刻被分配给 typename
。相反,该函数为您的 item
变量(某种程度上)维护一个 link,然后 link 返回到 _MyLayers[i]
的值——一个全局变量。
当 OpenLayers 为每个对象调用 loader
函数时,'Test:' + item.ServiceName,
被评估并分配给 typename
,其中 item
表示的值已经改变。它现在将指向最后一项(例如 _MyLayers[3]
),因为它是分配的最后一个值 item
。
通过替换上面的行,loader
函数现在每个维护一个唯一的 link 直接到全局 _MyLayers
。由于 i
是一个数字,因此每个加载程序函数都会根据 i
的值在 for
循环中定义该函数时实现一个语句(例如 _MyLayers[1]
,_MyLayers[2]
, ...等等)。
我最终将 item.ServiceName
的值分配给了 sourceVector。然后在loader函数中读取sourceVector的值。