为什么数组作为参数传递进去取不了值出来?

为什么数组作为参数传递进去取不了值出来? (arrData)
好像原来都OK的, 换个OS就不行了?
还有这种诡异的事?
各位兄弟帮忙看一下, 谢了.
或者说该怎样取值?

+展开
-JavaScript
function Test(){ 

var arrData = []; 
GetInfo(arrData); 


function GetInfo(arrData) { 
      if(bXmlHttpSupport) { 
              var sUrl = 'info.php'
              var oRequest = new XMLHttpRequest(); 
              oRequest.onreadystatechange = function() { 
                    if(oRequest.readyState == 4) {  
                            var obj = eval('(' + oRequest.responseText + ')'); 
                            arrData  = obj.Data1; 
                    } 
              } 
              oRequest.open('POST', sUrl); 
              oRequest.send(null); 
      } 




问题点数:100 回复次数:42
-------------------------------

showbo
/

发表于:2009-05-18 10:29:101楼 得分:0
和系统没关系吧。。

你的bXmlHttpSupport是不是限定了只有支持XMLHttpRequest的浏览器???

如果是你使用ie6浏览器是创建不了XMLHttpRequest的,只能使用activx



wjfmail
f16

发表于:2009-05-18 12:40:333楼 得分:0
向一楼的仁兄学习,没留意过这个问题.


y_cc
允许的空间, 时间内
发表于:2009-05-18 14:06:204楼 得分:0
不关ajax的事. 再说明一遍函数吧.

+展开
-JavaScript
function Test(){ 

var arrData = []; 
GetInfo(arrData); 
alert(arrData);//----------------->空值 


function GetInfo(arrData) { 
      if(bXmlHttpSupport) { 
              var sUrl = 'info.php'
              var oRequest = new XMLHttpRequest(); 
              oRequest.onreadystatechange = function() { 
                    if(oRequest.readyState == 4) {  
                            var obj = eval('(' + oRequest.responseText + ')'); 
                            arrData  = obj.Data1; 
                            alert(arrData);//----------------->有数据 
                    } 
              } 
              oRequest.open('POST', sUrl); 
              oRequest.send(null); 
      } 

}  


showbo
/
发表于:2009-05-18 15:10:025楼 得分:0
知道你错哪里了

oRequest.open('POST', sUrl); //这里没指定第3个参数时,就是默认为异步提交

这样

GetInfo(arrData);
alert(arrData);//----------------->有可能ajax还没返回,所以这里输出为空

但是
+展开
-JavaScript
var obj = eval('(' + oRequest.responseText + ')'); 
                            arrData  = obj.Data1; 
                            alert(arrData);//----------------->有数据 


你在状态函数中alert,而且状态为4了,这样当然有数据了


改为同步的,指定为 oRequest.open('POST', sUrl,false);




y_cc
允许的空间, 时间内
发表于:2009-05-18 15:52:437楼 得分:0
我用先后步骤测试过了, 是先得到数据, 才到这步的, 所以设置同步还是一样的

GetInfo(arrData);
alert(arrData);//----------------->有可能ajax还没返回,所以这里输出为空



showbo
/
发表于:2009-05-18 16:16:068楼 得分:100
在仔细一看,找出了一个很严重的错误,js非obj对象变量是不能引用赋值的,就是变量的作用域的问题,当然同步的问题也可能存在

+展开
-JavaScript
function Test(){ 

var arrData = []; 
GetInfo(arrData); 


function GetInfo(arrData) { 
      if(bXmlHttpSupport) { 
              var sUrl = 'info.php'
              var oRequest = new XMLHttpRequest(); 
              oRequest.onreadystatechange = function() { 
                    if(oRequest.readyState == 4) {  
                            var obj = eval('(' + oRequest.responseText + ')'); 
                            arrData  = obj.Data1;//其实你这里设置的是GetInfo的参数arrData,并未设置 Test里面的arrData变量,GetInfo的参数arrData只是存储Test里面的arrData的值的另外一个变量,不知道这样说你清楚没有 
                    } 
              } 
              oRequest.open('POST', sUrl); 
              oRequest.send(null); 
      } 



你运行下面的例子就知道了,你的错误是变量作用域,和可能存在的同步问题


+展开
-HTML
<script>
var d;v//全局变量d
alert(d)//输出undefined
function setD(d){
  d={name:'showbo'};
alert(d)//输出[object Object],此时是参数d,而非全局变量d,并且参数d只是全局变量d的一个拷贝,并非是全局变量d的引用
setD('xx');
alert(d)//输出undefined
</script> 






showbo
/ 发表于:2009-05-18 16:18:249楼 得分:0
代码加说明时出错了,下面这个才是正确的。。
+展开
-HTML
<script>
var d;
alert(d)
function setD(d){
  d={name:'showbo'};
alert(d)
}
setD('xx');
alert(d)
</script> 




fx_blog
发表于:2009-05-18 16:19:1010楼 得分:0

调用错了,兄弟.
你应该在给数组辅值后,再到判断有没有值.


+展开
-HTML
<html> 
<head> 
<script> 
function arrHasVal(arr) 

return arr.length>0?true:false
//在这里操作数据. 
//而不应在ajax里方法操作数据 

</script>  
</head> 
</html> 


function Test(){ 

var arrData = []; 
GetInfo(arrData); 
alert(arrData);//----------------->空值 


function GetInfo(arrData) { 
      if(bXmlHttpSupport) { 
              var sUrl = 'info.php'; 
              var oRequest = new XMLHttpRequest(); 
              oRequest.onreadystatechange = function() { 
                    if(oRequest.readyState == 4) {  
                            var obj = eval('(' + oRequest.responseText + ')'); 
                            arrData  = obj.Data1; 
                            alert(arrData);//----------------->有数据 
                                arrHasVal(arrData); 
                    } 
              } 
              oRequest.open('POST', sUrl); 
              oRequest.send(null); 
      } 





y_cc
允许的空间, 时间内
发表于:2009-05-18 19:54:1412楼 得分:0
那么该怎么像C语言一样给全局参数赋值?
就是引用赋值.
或者有什么其他的办法?


showbo
/
发表于:2009-05-19 08:49:1413楼 得分:0
全局变量

js非obj变量没有引用的,就是传址
+展开
-JavaScript
var arrData//全局变量
function Test(){ 
GetInfo(); 


function GetInfo() { 
      if(bXmlHttpSupport) { 
              var sUrl = 'info.php'
              var oRequest = new XMLHttpRequest(); 
              oRequest.onreadystatechange = function() { 
                    if(oRequest.readyState == 4) {  
                            var obj = eval('(' + oRequest.responseText + ')'); 
                            arrData  = obj.Data1; 
                    } 
              } 
           oRequest.open('POST', sUrl,false); //注意要同步提交,要不在ajax状态为4前都不能使用arrData,如果为同步提交可以不需要处理函数了,直接后面
           oRequest.send(null); 
//arrData=eval('(' + oRequest.responseText + ')'); //同步可以不需要处理状态
      } 


 


加支付宝好友偷能量挖...


原创文章,转载请注明出处:为什么数组作为参数传递进去取不了值出来?

评论(0)Web开发网
阅读(266)喜欢(0)JavaScript/Ajax开发技巧