确定Javascript函数作用域问题的范围

确定Javascript函数作用域问题的范围,javascript,jquery,function,scope,Javascript,Jquery,Function,Scope,很明显,我不理解Javascript中函数的作用域。下面是最新的例子: function riseData() { var jsonResult; $.ajax({ success: function(data, textStatus, jqXHR){ jsonResult = jqXHR.responseText; alert("Inside: " + jsonResult); },

很明显,我不理解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());                            
});
当我执行此操作时,内部警报正常工作,但外部警报显示undefined,尽管riseData显然只在前面几行定义。代码前面有一个$.ajaxSetup,它定义了ajax调用的参数。ajax调用在内部警报中成功返回请求的数据

我只是不知道如何使必要的数据jqXHR.responseText可用于脚本的其他部分


有谁能告诉我一个傻瓜的Javascript范围,如何解决这个问题吗?

你的例子范围很好。你的问题是你不理解JavaScript主要是异步的

让我通过你的例子向你展示

您的文档就绪处理程序将运行。 它称为riseData。 riseData声明了一个变量jsonResult。 riseData调用$.ajax,它计划完成一个ajax请求,但响应将在稍后发生。 由于$.ajax通常是非阻塞/异步的,因此riseData将继续并返回jsonResult。由于AJAX请求尚未完成,因此尚未分配jsonResult,因此返回默认值undefined。 在文档就绪处理程序中,您将得到alertOutside:+undefined;。 事件循环到几毫秒后,会发生以下情况:

AJAX请求已完成。jQuery将此转发给回调。 jsonResult已设置,但riseData已返回。 在文档就绪处理程序已发出未定义警报后,riseData内部的警报将使用新数据发出警报。 这个问题有两种解决方案。第一种解决方案很简单,但通常会导致更糟糕的用户体验。此解决方案是将async:false选项添加到$.ajax。这会使$.ajax阻塞并冻结浏览器

第二种解决方案是对几乎所有内容采用异步样式。这意味着让riseData接受回调并在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调用是异步的,因此riseData函数在执行ajax调用之前返回一个值。尝试在方法之外设置变量

var jsonResult;

function riseData() { 

    $.ajax({
...
jsonResult不仅应该在riseData中可用,还应该在out中可用。但是,您仍然会遇到一个问题,即它何时被填充

更多说明的链接:


riseData实际上返回了var jsonResult的值,返回时该值为空。问题是AJAX调用根本没有范围问题。如果$.ajax是同步的,它就可以正常工作。因此,没有范围问题。如果.ajax不是同步的,那么如果该值将在其他地方使用,则存在范围问题。同步Ajax不是一个考虑异步的OxMORon吗?这是真的,如果你认为Ajax严格地是首字母缩写词,那么它是一个矛盾修饰词,但是很多人也使用JavaJavaXML代替了XML。无论如何,OP返回jsonResult并使用函数的返回值。在riseData之外没有试图通过jsonResult的名称访问jsonResult。哦,我认为这是通过以下语句询问在riseData之外获取jsonResult所暗示的,…可用于脚本的其他部分。哦,好吧,我应该远离这些快速回答类型。啊哈!!谢谢所以设置。asynch:false,$.axsetup中的[br][br]修复了它。现在我所要做的就是主迷你降价,它似乎改变了发布帖子时发布评论的规则。添加空白似乎不可能的Inr。。。无论如何,谢谢你的帮助!