我使用谷歌地图api,我注意到了我在JavaScript中不熟悉的程序化行为:
function success(pos) {
// ...do something with pos.
}
navigator.geolocation.getCurrentPosition(success);
在上面的示例中,似乎成功函数已通过' pos'来自稀薄空气的论证和成功函数不是通过括号在getCurrentPosition参数内调用的。我希望看到这样的事情:
function success(pos) {
//...do something with pos.
}
var pos = //...something;
navigator.geolocation.getCurrentPosition(success(pos));
我只是不明白这里发生了什么。论证来自何处以及为什么即使用括号调用该函数?
答案 0 :(得分:0)
这是您将在Javascript中经常看到的功能。它通常被称为回调。缺少括号是因为Javascript允许您将函数视为变量,通常称为“第一类函数”。您正在将success
函数传递给getCurrentPosition
方法,而您实际上并未调用success
方法。
当您致电navigator.geolocation.getCurrentPosition(success);
时,您正在向getCurrentPosition
函数说明,当您找到该位置时,您希望它调用您提供的功能并将其传递给它。
getCurrentPosition
方法将执行以下操作:
function getCurrentPosition(successCallback) {
var position = loadFromSomewhereThatMayTakeAWhile();
successCallback(position);
}
getCurrentPosition
可能需要几秒甚至几分钟才能获得当前位置。您不希望浏览器在发生这种情况时停止响应。回调允许你说"当这个操作完成后,调用另一个方法来做结果"。然后,浏览器可以继续执行其他操作,并仅在操作完成时执行回调。
jQuery ajax函数使用此回调样式。
var whenSuccessful = function(data, status, xhr){
console.log('The data was loaded successfully.')
};
var whenFailed = function(xhr, status, error){
console.log('The request failed!')
};
$.ajax({
url: "http://myserver.com/some_data.json",
error: whenFailed, // do this if the request fails for any reason
success: whenSuccessful // do this if the data was loaded successfully
})