我总是遇到一个问题,理解从空气中传递的并没有在任何地方声明的变量,例如,请参阅下面的脚本,当我试图了解地理位置API时,我可以跨越它:
function geoFindMe() {
var output = document.getElementById("out");
if (!navigator.geolocation){
output.innerHTML = "<p>Geolocation is not supported by your browser</p>";
return;
}
function success(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
output.innerHTML = '<p>Latitude is ' + latitude + '° <br>Longitude is ' + longitude + '°</p>';
var img = new Image();
img.src = "https://maps.googleapis.com/maps/api/staticmap?center=" + latitude + "," + longitude + "&zoom=13&size=300x300&sensor=false";
output.appendChild(img);
};
function error() {
output.innerHTML = "Unable to retrieve your location";
};
output.innerHTML = "<p>Locating…</p>";
navigator.geolocation.getCurrentPosition(success, error);
}
上面的代码可以看作 HERE 。
现在查看以下内容:
function success(position) {
现在究竟是谁将position
变量传递给成功函数?这真让我感到困惑,我在使用jQuery Ajax函数时看到了类似的东西。有人可以解释这个变量的概念是从无从哪里传来的?
答案 0 :(得分:1)
下面:
navigator.geolocation.getCurrentPosition(success, error);
...您将success
传递给getCurrentPosition
。
在某些时候,getCurrentPosition
或其调用的另一个函数会调用success
并传递一些参数。
他们不是来自空气,他们来自你的代码所调用的功能。只是其他人写了这个功能。
答案 1 :(得分:1)
为了理解回调函数的运作方式,必须要理解在JavaScript中,函数是对象。如果我将函数A作为参数传递给函数B,函数B可以在内部调用函数A,并使用在调用函数B时不需要的变量。
回调在异步代码中尤其重要,我不会立即收到函数的答案,但是当我收到答案时想要触发事件。在这种特殊情况下,
navigator.geolocation.getCurrentPosition(success, error);
是函数B.它期望两个函数作为参数。如果函数成功则调用一个,如果函数错误则调用一个。
如果调用成功,getCurrentPosition()的实现将使用描述您尝试检索的CurrentPosition的对象作为参数调用成功回调。
为了进一步解释发生的事情,这里有一个例子:
function callFunctionWithOneAsFirstArg(callback) {
callback(1);
}
callFunctionWithOneAsFirstArg(function(number) { console.log(number); });
在这种情况下,callFunctionWithOneAsFirstArg()的调用不知道如何设置数字。尽管如此,它可以依赖于库提供的callFunctionWithOneAsFirstArg()将执行预期的行为。
您可能会注意到在javascript中使用回调的另一个示例是当您需要处理外部事件(如点击)时。例如,每当单击一个按钮时,您可能希望触发某个功能。因为您想要延迟调用回调函数,所以当您和仅当单击按钮时,您创建的EventListener将为您调用回调。