2015-10-18 43 views
1

我一直有一个理解从稀薄空气中传递并且没有在任何地方声明的可读文件的问题,例如参见下面的脚本,当我试图理解时我可以穿过它的地理位置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功能类似的事情。有人可以解释这个变量的概念是从哪里传递的吗?

回答

1

这里:

navigator.geolocation.getCurrentPosition(success, error); 

...你传递successgetCurrentPosition

在某个点上,或者getCurrentPosition或其调用的另一个函数将调用success并传递一些参数。

他们不是来自空气稀薄,他们来自你的代码调用的函数。只是有人写了这个功能。

+0

'在某个时候,getCurrentPosition或者其他调用的函数会调用成功并传递一些参数。“你能举个例子吗?我仍然很困惑,这... –

+0

'function getCurrentPosition(callback){callback(“here are your coordinates”); }' – Quentin

+0

恐怕这仍然没有道理!谢谢你尝试。 –

1

成功是callback function

为了理解回调函数是如何操作的,必须明白在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只会在单击按钮时调用回调函数。