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的值。