作为参数传递的JavaScript typeof函数返回undefined

时间:2015-10-02 18:33:20

标签: javascript

下面的示例运行正常,但是,我正在尝试使函数handleArcs()更具通用性(即handleLayer())。

我的layerVar有一个属性onEachFeature,它将方法onEachArc应用于图层的每个要素。我希望handleArcs()将函数onEachArc()作为参数,但它不起作用,当我通过它并查看typeof时,结果为undefined。基本上它是一个简单的函数作为另一个函数的参数传递,但它在这种情况下不起作用。

我的第一个假设是上下文this出了问题。但是因为typeof thisShouldBeAFunction返回undefined,我现在不确定问题是什么。

任何猜测可能导致问题的原因是什么?

function onEachArc(feature, layer) {
    if (feature.properties) {
        layer.bindPopup("<b>" + feature.properties.linkstr + "</b> has speed " + feature.properties.speed + ".");
    }
}; 

function handleArcs(data, layerVar, layerName, thisShouldBeAFunction) {
    alert(typeof thisShouldBeAFunction);

    //Add the feature to the map
    layerVar = new L.geoJson(data, {
        onEachFeature: onEachArc
        }).addTo(map);
}

getData('Layers/arcs.json').done(handleArcs(arcs, "Arcs", onEachArc));

getData()调用jQuery AJAX方法从服务器获取数据:

 function getData(url) {
     return $.ajax({
              url : url,
              type: 'GET',
              error : function (xhr,status,error){alert("An error happened while loading a file: "+error+".")}
              });
}

1 个答案:

答案 0 :(得分:2)

正如@Tushar所说,不要立即调用handleArcs,将其包含在具有适当签名的匿名函数中,并将其传递给done

getData('Layers/arcs.json').done(function(data) { 
  handleArcs(data, arcs, "Arcs", onEachArc); 
});

我不太明白

的意思
layerVar = new L.geoJson(...

handleArcs内。您不希望此作业影响您传入的arcs变量,是吗?

关于全局变量作为参数:

var aGlobal = "Test_One";

function TryToChangeIt(aParam) {
  aParam = "Test_Two";
}

function MyFunction(aParam) { 
  alert("Before: " + aGlobal);

  TryToChangeIt(aGlobal);

  alert("After: " + aGlobal);
}

通过调用TryToChangeIt(aGlobal);,我们传递全局变量的值 - not name 。 javascript引擎创建一个新的临时变量作为参数,并在调用aGlobal之前为其分配TryToChangeIt的值。在TryToChangeIt内,我们可以更改此临时变量的值,但这不会影响aGlobal的值。