将参数传递给嵌套函数Google Maps v3

时间:2015-01-09 01:31:02

标签: javascript google-maps google-maps-api-3

抱歉这里有新问题,但我是javascript新手。理想情况下,我想呼吁myLoop(latLong);但除非我把变量放在函数之外,否则我似乎无法让.setPosition()识别变量。

    var x = 0;
    var y = 0;
    var z = 0;
    var v = 0;

    function xy(a,b,c,d) {
        var longDistance = Math.abs(a-d);
        var longTime = longDistance/0.1*0.5;            
        var latDistance = b-c;
        var latRate = latDistance/longTime*0.5;
        x = a; //origin long
        y = b; //oringin lat
        z = latRate;
        w = d; //destination long
        v = c; //destination lat
    }

    function myLoop () {        
        setTimeout(function () {
            var latLong = new google.maps.LatLng(y,x);
            marker.setPosition(latLong); 
            x = x + 0.1;
            y = y - z;
            if (x < w && y < v) { 
                myLoop();
            } else {

                alert('finished');

            }
        }, 0.5)
    }

    xy(-118,33,40,-73);
    myLoop();

1 个答案:

答案 0 :(得分:0)

您只需要递归地将latLong变量传递给myLoop()函数。

为此,您可以在函数外部创建第一个latLong变量,然后调用函数(传入第一个latLong变量),然后在latLong函数中检查您的条件,如果需要调用再次使用myLoop函数,更新latLong变量,然后再次调用myLoop函数。

以下是您的递归代码:

var x = 0;
var y = 0;
var z = 0;
var v = 0;

// Your first latLong
var latLong = new google.maps.LatLng(y,x);

function xy(a,b,c,d) {
    // ...
}

// Pass in the latLong variable
function myLoop (latLong) {        
        setTimeout(function () {
            marker.setPosition(latLong); 
            x = x + 0.1;
            y = y - z;
            if (x < w && y < v) { 

                // now create a new latLong, and pass it 
                // back into this function recursively
                latLong = new google.maps.LatLng(y,x);
                myLoop(latLong);

            } else {
                alert('finished');
            }
        }, 0.5)
    }

xy(-118,33,40,-73);

// Now call the myLoop function to get the recursion started
myLoop(latLong);



或者,您可以将所有代码包装到一个函数

使用revealing module pattern,您可以在一个地方(在一个名为latLongGenerator的函数对象中)包含所有循环功能,从而在代码逻辑中实现良好的分离,但仍然可以为您提供干净的界面使用。重组的“揭示模块”代码如下所示:

var latLongGenerator = (function () {

   var x = 0;
   var y = 0;
   var z = 0;
   var v = 0;
   var latLong;

   function setXY(a,b,c,d) {
      var longDistance = Math.abs(a-d);
      var longTime = longDistance/0.1*0.5;            
      var latDistance = b-c;
      var latRate = latDistance/longTime*0.5;
      x = a; //origin long
      y = b; //oringin lat
      z = latRate;
      w = d; //destination long
      v = c; //destination lat

      // pass in the initial latLong to myLoop(latLong) from here
      latLong = new google.maps.LatLng(y,x);
      myLoop(latLong);
    }

    // This is the only function that will
    // be exposed publicly on this function
    // Example usage: latLongGenerator.startLoopWith(0,0,0,0);
    function startLoopWith(a,b,c,d){
       setXY(a,b,c,d);

    }

    function myLoop (latLong) {        
        setTimeout(function () {
            marker.setPosition(latLong); 
            x = x + 0.1;
            y = y - z;
            if (x < w && y < v) {
                // recursively call the loop from here
                latLong = new google.maps.LatLng(y,x);
                myLoop(latLong);
            } else {
                alert('finished');
            }
        }, 0.5);
    }

    return {
        startLoopWith:startLoopWith
    };

})();

// Finally, you can start your loop by passing in
// your initial values to latLongGenerator.startLoopWith(...)
latLongGenerator.startLoopWith(-118,33,40,-73); 

这种结构为您提供了一种封装所有计算逻辑的简洁方法,同时还为您提供了一个漂亮,干净的入口点。使用这个新的重构,你可以用一行开始你的循环:

latLongGenerator.startLoopWith(-118,33,40,-73); 

我没有测试过这段代码,但它可以帮助您走上正确的道路。

希望这有帮助!