解决Javascript函数范围问题

| 很明显,我不理解Javascript中函数的作用域。这是最新的示例:
function riseData() { 
    var jsonResult;
    $.ajax({
        success: function(data, textStatus, jqXHR){
            jsonResult = jqXHR.responseText;
            alert(\"Inside: \" + jsonResult);
        },          
        error: function (jqXHR, textStatus, errorThrown) {  
            $(\'#errLog\').append(\'<br>Status: \' + qXHR.statusText);                  
        }
    });
    return jsonResult;
}

$(document).ready(function(){
    var intervalID = setInterval(\'UTCclock()\',100); 
    alert(\"Outside: \" + riseData());                            
});
当我执行此操作时,\“ Inside \”警报将正常运行,但是\“ Outside \”警报将显示\“ undefined \”,即使riseData()显然仅在前面几行定义了。在代码的前面有一个$ .ajaxSetup,它定义了ajax调用的参数。 ajax调用成功在““ Inside \”警报中返回请求的数据。 我只是丝毫不知道如何使必要的数据(jqXHR.responseText)可用于脚本的其他部分。 谁能指出我的“针对傻瓜的Javascript范围界定”方法来解决此问题?     
已邀请:
        您的示例范围很好。您的问题是您不了解JavaScript主要是异步的。 让我通过您的例子向您展示。 您的文档就绪处理程序将运行。 它称为
riseData
riseData
声明变量,3ѭ。
riseData
调用
$.ajax
,它安排要完成的AJAX请求,但响应将稍后发生。 由于
$.ajax
通常是非阻塞/异步的,,1ѭ继续并返回
jsonResult
。由于尚未完成AJAX请求,因此尚未分配
jsonResult
,因此返回默认值
undefined
。 在准备文档的处理程序中,您最终得到
alert(\"Outside: \"+undefined);
。 一个事件循环发生到几毫秒后,发生这种情况: AJAX请求已完成。 jQuery将此转发到您的回调。 设置了
jsonResult
,但是
riseData
已经返回。 在文档准备处理程序已警告
undefined
之后,alerted1ѭ中的
alert
会发出新数据警报。 有两个解决方案。第一种解决方案很简单,但是通常会导致更糟的用户体验。该解决方案是将“ 17”选项添加到“ 5”。这使得
$.ajax
阻止并冻结了浏览器。 第二种解决方案是对几乎所有内容都采用异步样式。这意味着使“ 1”接受回调并在AJAX响应处理程序中调用它。这是使用此方法转换的代码:
function riseData(callback) { 
    $.ajax({
        success: function(data, textStatus, jqXHR){
            var jsonResult = jqXHR.responseText;
            alert(\"Inside: \" + jsonResult);
            callback(jsonResult);
        },          
        error: function (jqXHR, textStatus, errorThrown) {  
            $(\'#errLog\').append(\'<br>Status: \' + qXHR.statusText);                  
        }
    });
}

$(document).ready(function(){
    //var intervalID = setInterval(\'UTCclock()\',100); 
    // Unrelated, but it\'s better to pass a
    // function into setInterval than a string.
    var intervalID = setInterval(UTCclock, 100);
    riseData(function(jsonResult) {
        alert(\"Outside: \" + jsonResult);
    });
});
    
        这只是部分范围问题。您的ajax调用是异步的,因此,执行ajax调用之前,riseData()函数将返回一个值。尝试在方法之外设置变量。
var jsonResult;

function riseData() { 

    $.ajax({
...
jsonResult不仅应该在riseData()中可用,而且应该可以使用。但是,仍然存在确切何时填充的问题。 有关更多说明的链接: JavaScript中变量的范围是什么?     

要回复问题请先登录注册