2015-10-18 48 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只會在單擊按鈕時調用回調函數。