Javascript在匿名函数中分配变量的值

Javascript assign value of variable inside anonymous function

本文关键字:分配 变量 函数 Javascript      更新时间:2023-09-26

我正在尝试为OpenLayers创建几个层。我循环遍历数组,并使用typename: 'Test:' + item.ServiceName为每个值分配值。问题是当OpenLayer调用函数时,它会获取项的最后一个赋值。ServiceName始终为"Test_Layer_3",因此不使用Test_Layer_1和Test_Layel_2。

如何更改它,以便将Test_Layer_1、Test_Layel_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);
    }

它应该通过用_MyLayers[i].ServiceName替换item.ServiceName来工作

解释

定义loader函数时,并不意味着item.ServiceName此时已分配给typename。相反,该函数维护一个到item变量的链接(有点),然后链接回_MyLayers[i]的值——一个全局值。

当OpenLayers为每个对象调用loader函数时,'Test:' + item.ServiceName,被评估并分配给typename,其中item表示的值已经改变。它现在将指向最后一个项目(例如_MyLayers[3]),因为它是分配给item的最后一个值。

通过替换上面的行,loader函数现在每个都保持直接到全局_MyLayers的唯一链接。由于i是一个数字,每个加载器函数都会根据for循环中定义函数时i的值来实现一个语句(例如_MyLayers[1]_MyLayers[2]…等等)。

我最终将item.ServiceName的值分配给了sourceVector。然后在loader函数中读取sourceVector的值。