2015-04-23 92 views
0

我返回了rsltCallback函數,當我調用googleSearchSuggestions函數時,我得到了未定義的值。當我console.log輸入參數裏面的rsltCallback函數它將輸出打印到控制檯。如何訪問全局局部變量的值

var googleSearchSuggestions = function(search_Keyword , element) { 


    var parsed; 

    var uri = 'http://suggestqueries.google.com/complete/search?output=toolbar&hl=en&q=' + search_Keyword; 

    var xhr = (typeof XMLHttpRequest !== 'undefined') ? new XMLHttpRequest() : new ActiveXObject(Microsoft.XMLHTTP); 



    xhr.onreadystatechange = function(){ 

    xhr.responseType = 'xml'; 



    if(xhr.status == 200 && xhr.readyState == 4) 
    { 

     var response = xhr.responseXML;  

     var items = response.getElementsByTagName('toplevel') 

     for (var i = 0 ; i < items[0].childNodes.length;i++) 
     { 




      parsed = items[0].childNodes[i].firstElementChild.getAttribute('data'); 

      rsltcallBack(parsed); 



     } 




    } 



    }; 

xhr.open('GET', decodeURI(uri), true); 

xhr.send(); 

var rsltcallBack = function(input){ 

    return input; 


}; 

    return rsltCallBack(); 

}; 
+3

http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call –

回答

0

由於您的方法中有一個異步函數調用,因此您需要稍後返回parsedValue。一種方法是promises

如果您希望該變量可以全局訪問,那麼您可以將其添加到window(例如,window.parsedOutput = ...)。

+0

我試過@Rouby,它不起作用。我越來越沒有定義... –

+0

我認爲你打電話給googlesearch後,你試圖訪問變量。這很可能不起作用,因爲xhr還沒有完成。看看延期解決方案又名承諾。 – Rouby

+0

那麼解決這個問題的最好方法是什麼? –

0

而不是訪問本地變量的,只是初始化函數外部變量和局部賦值, 複製粘貼此,

var parsed =""; 
var googleSearchSuggestions = function(search_Keyword , element) { 
var uri = 'http://suggestqueries.google.com/complete/search?output=toolbar&hl=en&q=' + search_Keyword; 

var xhr = (typeof XMLHttpRequest !== 'undefined') ? new XMLHttpRequest() : new ActiveXObject(Microsoft.XMLHTTP); 



xhr.onreadystatechange = function(){ 

xhr.responseType = 'xml'; 

xhr.open('GET', decodeURI(uri), true); 

xhr.send(); 

if(xhr.status == 200 && xhr.readyState == 4) 
{ 

    var response = xhr.responseXML;  

    var items = response.getElementsByTagName('toplevel') 


    for (var i = 0 ; i < items[0].childNodes.length;i++) 
    { 




     parsed = items[0].childNodes[i].firstElementChild.getAttribute('data'); 

     rsltcallBack(parsed); 



    } 






} 



} 

}; 



function rsltcallBack(input) 
{ 
setTimeout(function() 
{ 
    alert(input); 
},2000); 

} 
+0

評論是不適合擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/76063/discussion-on-answer-by-nandan-how-to-access-the-values-of-local-variables-格洛巴)。 – Taryn

0

有聲明全局變量

var carName; 

function myFunction() {  
    carName = 'Volvo';  
} 
的幾種方法

本示例在函數外部聲明變量,然後在函數範圍內爲其分配值。

另一個是

function myFunction() {  
     window.carName = 'Volvo';  
    } 

這設置其可以使用刪除window.carName要刪除的窗口上的變量。

+0

沒有人,它不起作用。不管怎樣,謝謝 –

0
This incident as JavaScript Variable hosting issue. for ex: 

    var value = "a"; 

function test() { 
    var value; 
    alert(value) 

} 

test(); 

the global variable return undefined error. same code as works fine as below 

    var value = 10; 

function test() { 
    var value ="b"; 
    alert(value); 

} 

test(); 

online reference : 

http://techslides.com/understanding-javascript-closures-and-scope

http://stackoverflow.com/questions/9085839/surprised-that-global-variable-has-undefined-value-in-javascript 
0

的onreadystatechange的功能狀態已經改變之後,纔會被調用。這不是直接的;有一段時間國家尚未改變。因此,只有在調用onreadystatechange函數後才能訪問parsedOutput;其價值尚未確定。 JavaScript不會停下來等待這發生;它允許請求在後臺進行。即使onreadystatechange方法尚未被調用,它仍繼續執行你的代碼。

要解決您的問題,只需在使用parsedOutput之前等待響應即可。你可以通過使用onreadystatechange函數來觸發代碼中的下一步。

順便說一句,在這樣的背景下執行請求是調用異步請求。這是您如何使用JavaScript進行遠程請求;它可以防止腳本在等待響應時掛起。