小编Mar*_* P.的帖子

变量全局范围理解问题

我的问题实际上是一个理解 - 我有一个有效的解决方案,我只是不明白它是如何工作的.

好的,所以 - 我要做的是在循环中添加一个setTimeout,并通过它传递一个变化的值.例:

for (i=0;i<11;i++)
{
     setTimeout("alert(i)",1000);
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这不起作用,因为Javascript不(像PHP)将i的值传递给函数,但传递i的引用 - 这反过来不是静态的,但继续随计数器更改.

我找到了一个解决方案,如下所示:

for (i=0;i<11;i++)
{
    setTimeout(function(x){return function(){alert(x)};}(i),1000);
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白这实际上是做什么的.看起来它将"警报"功能传递回调用函数,但我无法理解.

我可以使用这个解决方案,并将其适应其他环境,但我真的很想了解我的所有代码,而不仅仅是使用我在某处找到的东西,并且很高兴它的工作原理.此外,我正在寻找一个更纤薄的版本来实现同样的目标.

谢谢,马可

javascript variables scope

5
推荐指数
1
解决办法
146
查看次数

奇怪的大圆距离计算

使用地图进行大圆距离计算时遇到一些问题.

背景:http://airports.palzkill.de/search/

该地图应该作为一个大圆距离搜索地图 - 您移动圆心标记或半径标记,并且圆变小或变大.出于调试目的,框标题字段显示以km为单位的计算距离.

只要圆心接近0/0,并且半径标记距离它不太远,这只能正常工作.你把任何一个标记移动到"极端"的次数越多,整个事物的切线越多,除了垃圾之外什么都不会产生.

这是用于计算更新的代码,您还可以在JS文件js.js中找到整个代码,第146到184行:

function searchmapupdate()
{   
rad_lat_radiuspos = (circleradiusmarker.getPosition().lat()*Math.PI/180);
rad_lon_radiuspos = (circleradiusmarker.getPosition().lng()*Math.PI/180);
rad_lat_circlecenter = (circlecentermarker.getPosition().lat()*Math.PI/180);
rad_lon_circlecenter = (circlecentermarker.getPosition().lng()*Math.PI/180);

circleradiusvar = Math.acos(Math.sin(rad_lat_circlecenter)*Math.sin(rad_lat_radiuspos)+Math.cos(rad_lat_circlecenter)*Math.cos(rad_lon_radiuspos)*Math.cos(rad_lon_circlecenter-rad_lon_radiuspos))*6371.01*1000;

if (isNaN(circleradiusvar)==false) circle.setOptions({center:circlecentermarker.getPosition(), radius:circleradiusvar});

document.getElementById("mapsearchhead").innerHTML = Math.round(circleradiusvar/1000);
}
Run Code Online (Sandbox Code Playgroud)

由于整个事情确实计算了一些正确的输出,我认为数学本身并不是完全错误的,我想只有一些"修正"的东西丢失了?不幸的是,我对三角学非常糟糕,所以我不知道这里可能有什么问题,甚至在哪里开始寻找有关如何修复它的想法.

马尔科

PS:我知道由于投影的球形特性,整个事物必须在两极之间采取"反直觉"的行为.但这并不能解释当你将两个标记移近赤道周围的日期线时会发生什么(0/179,0/-179).

javascript geocoding trigonometry great-circle

5
推荐指数
1
解决办法
807
查看次数