确定Javascript函数作用域问题的范围
很明显,我不理解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); },
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。。。无论如何,谢谢你的帮助!