用jquery中遇到变量作用域的问题

时间:2022-01-26 06:11:12

var optionStr="";
$.getJSON("/index.php/default/query/getCabinetRow/row_war_id/"+war_resource_id,function(data){
$.each(data,function(i,item){
optionStr+="<option value='"+item.row_id+"'>"+item.row_name+"</option>";
});
alert(optionStr);
});
alert(optionStr);

上一个alert可弹出内容,有值
但下一个alert就为空
这是什么原因

7 个解决方案

#1


因为它是异步执行的,
所有最外面的alert会先执行。
所以你就看到外面的是空的了。
同步执行就不会有问题了,
参考下面代码,你就明白了:



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">

<script language="javascript" type="text/javascript" src="jquery-1.4.2.js"></script>
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
var d = "";
<!--
//同步 async: false
//默认 async: true
$.ajax({url: "http://www.baidu.com", async: false, success: function(data) {
d = data;
alert(d);
}});

alert(d);

//-->
</SCRIPT>
</BODY>
</HTML>


#2


你不就是想把所有返回的值作为选项加入下拉框吗,那就直接在上一个ALERT那里加好了。
至于你说的这个现象,是有点不可思议,目前的代码看不出来。

#3


刚看到楼上的解释,是啊,唉,晕了。

#4


更好理解的一个例子:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">

<script language="javascript" type="text/javascript" src="jquery-1.4.2.js"></script>
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
var d = "";

<!--
//同步 async: false
//默认 async: true
$.ajax({url: "http://www.baidu.com", async: true, success: function(data) {
d = data;
//alert(d);
}});

alert(d);

//这里面设置2秒,
//根据你网速来设
//保证此时$.ajax已经返回
setTimeout(function(){alert(d);}, 2000);

//-->
</SCRIPT>
</BODY>
</HTML>

#5


每天回帖即可获得10分可用分!

#6


引用楼主 liujianliang 的回复:
JScript code

var optionStr="";
$.getJSON("/index.php/default/query/getCabinetRow/row_war_id/"+war_resource_id,function(data){
                        $.each(data,function(i,item){
              ……

设置成同步就好了

#7



没有值的原因就是ajax赋值还没有完成,最下面的alert就取值了。所以还是空值

#1


因为它是异步执行的,
所有最外面的alert会先执行。
所以你就看到外面的是空的了。
同步执行就不会有问题了,
参考下面代码,你就明白了:



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">

<script language="javascript" type="text/javascript" src="jquery-1.4.2.js"></script>
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
var d = "";
<!--
//同步 async: false
//默认 async: true
$.ajax({url: "http://www.baidu.com", async: false, success: function(data) {
d = data;
alert(d);
}});

alert(d);

//-->
</SCRIPT>
</BODY>
</HTML>


#2


你不就是想把所有返回的值作为选项加入下拉框吗,那就直接在上一个ALERT那里加好了。
至于你说的这个现象,是有点不可思议,目前的代码看不出来。

#3


刚看到楼上的解释,是啊,唉,晕了。

#4


更好理解的一个例子:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">

<script language="javascript" type="text/javascript" src="jquery-1.4.2.js"></script>
</HEAD>

<BODY>
<SCRIPT LANGUAGE="JavaScript">
var d = "";

<!--
//同步 async: false
//默认 async: true
$.ajax({url: "http://www.baidu.com", async: true, success: function(data) {
d = data;
//alert(d);
}});

alert(d);

//这里面设置2秒,
//根据你网速来设
//保证此时$.ajax已经返回
setTimeout(function(){alert(d);}, 2000);

//-->
</SCRIPT>
</BODY>
</HTML>

#5


每天回帖即可获得10分可用分!

#6


引用楼主 liujianliang 的回复:
JScript code

var optionStr="";
$.getJSON("/index.php/default/query/getCabinetRow/row_war_id/"+war_resource_id,function(data){
                        $.each(data,function(i,item){
              ……

设置成同步就好了

#7



没有值的原因就是ajax赋值还没有完成,最下面的alert就取值了。所以还是空值