2015-04-23 103 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进行远程请求;它可以防止脚本在等待响应时挂起。