各位仁兄,函数内局部变量赋值给全局变量不成功,如何解决?

uniond 2011-09-20 04:03:10
<span id=live1 style=position:absolute;left:250px;top:50px;width:109px; height:15px>这个文本</span>
<script language=JavaScript>
top1=document.getElementById("live1").style.top
var a1,b1,fn,fnx,topx
if(parseInt(top1)==50){a1=50;b1=639}
udx1=function(){
if(a1<b1){a1++;document.getElementById("live1").style.top=a1}
this.ax1=function(){if(a1==639){topx=a1;return topx}}
}
fn=new udx1
fnx=fn.ax1()
setInterval("udx1()",1)
</script>
-----------------------------------------
请教各位仁兄,为何fnx这个全局变量不能获取udx1函数内部的局部变量a1的值?fnx的值要为639才正确。如何解决?
...全文
655 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangws 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gewei565 的回复:]

难,因为setInterval是异步执行的,所以即使你把fnx=fn.ax1()放到interval后面,这一句还是会在interval之前执行,所以一般不要获取interval执行后的结果,尽量把逻辑在interval调用的方法中都实现了

引用 7 楼 uniond 的回复:

对,要让this.ax1=function(){if(a1==639){topx=a1;return to……
[/Quote]

这个。。JS没有异步这一说。因为JS是单线程的。。setTimeout与setInterval是把函数放到队列最末端
uniond 2011-09-21
  • 打赏
  • 举报
回复
兄台,代码有问题,a1的值应该从50递增,最后达到639才返回a1的值,按你这个代码,函数一运行a1的值就为639了,这个不对
[Quote=引用 10 楼 axiheyhey 的回复:]
引用 8 楼 uniond 的回复:

兄弟说的是,我要多学习才行,怎么解决?
引用 5 楼 axiheyhey 的回复:
这代码的逻辑和书写风格把我征服了。。
fn.ax1()是在循环前就已经调用了,而且只调用了一次,此时的a1=50,按照你的逻辑并不执行topx=a1;return topx,fnx自然是默认返回值undefined。。


JScript code
……
[/Quote]
uniond 2011-09-21
  • 打赏
  • 举报
回复
受教了,谢谢!确实是这个问题
[Quote=引用 9 楼 gewei565 的回复:]
难,因为setInterval是异步执行的,所以即使你把fnx=fn.ax1()放到interval后面,这一句还是会在interval之前执行,所以一般不要获取interval执行后的结果,尽量把逻辑在interval调用的方法中都实现了


引用 7 楼 uniond 的回复:

对,要让this.ax1=function(){if(a1==639){topx=a1;return t……
[/Quote]
「已注销」 2011-09-21
  • 打赏
  • 举报
回复
人家代码都被改的面目全非了
[Quote=引用 11 楼 axiheyhey 的回复:]

把console.log(a1);删掉
[/Quote]
uniond 2011-09-21
  • 打赏
  • 举报
回复
兄台的JS代码很厉害,佩服佩服
[Quote=引用 16 楼 axiheyhey 的回复:]
引用 14 楼 uniond 的回复:

兄台,代码有问题,a1的值应该从50递增,最后达到639才返回a1的值,按你这个代码,函数一运行a1的值就为639了,这个不对
引用 10 楼 axiheyhey 的回复:
引用 8 楼 uniond 的回复:

兄弟说的是,我要多学习才行,怎么解决?
引用 5 楼 axiheyhey 的回复:
这代码的逻辑和书写风格把我征服了。。
fn……
[/Quote]
峭沙 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 uniond 的回复:]

兄台,代码有问题,a1的值应该从50递增,最后达到639才返回a1的值,按你这个代码,函数一运行a1的值就为639了,这个不对
引用 10 楼 axiheyhey 的回复:
引用 8 楼 uniond 的回复:

兄弟说的是,我要多学习才行,怎么解决?
引用 5 楼 axiheyhey 的回复:
这代码的逻辑和书写风格把我征服了。。
fn.ax1()是在循环前就已经调用了,而且只调……
[/Quote]我蛋疼了,如果你觉得a1直接就是639的话,你可以在循环里加个alert试试。。
峭沙 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gewei565 的回复:]

人家代码都被改的面目全非了
引用 11 楼 axiheyhey 的回复:

把console.log(a1);删掉
[/Quote]他的代码不大改能用吗。。
峭沙 2011-09-20
  • 打赏
  • 举报
回复
把console.log(a1);删掉
峭沙 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 uniond 的回复:]

兄弟说的是,我要多学习才行,怎么解决?
引用 5 楼 axiheyhey 的回复:
这代码的逻辑和书写风格把我征服了。。
fn.ax1()是在循环前就已经调用了,而且只调用了一次,此时的a1=50,按照你的逻辑并不执行topx=a1;return topx,fnx自然是默认返回值undefined。。
[/Quote]
		var top1=document.getElementById("live1").style.top;
var a1,b1,fn,fnx,topx;
if(parseInt(top1)==50){
a1=50;
b1=639;
}
var udx1=function(){
if(a1<b1){
a1++;
console.log(a1);
document.getElementById("live1").style.top=a1;
if(a1==639){
return a1;
}
}
}
while(!topx){
topx = udx1();
}
alert(topx);
这是你要的效果吧。。
「已注销」 2011-09-20
  • 打赏
  • 举报
回复
难,因为setInterval是异步执行的,所以即使你把fnx=fn.ax1()放到interval后面,这一句还是会在interval之前执行,所以一般不要获取interval执行后的结果,尽量把逻辑在interval调用的方法中都实现了

[Quote=引用 7 楼 uniond 的回复:]

对,要让this.ax1=function(){if(a1==639){topx=a1;return topx}不断的interval才能随时获得a1的值,那么怎么实现?
引用 4 楼 gewei565 的回复:
变量是肯定能访问到的
代码执行到fnx=fn.ax1()时你的ax1方法if条件不满足,是没有返回值的,所以得到的才是undefined,你后面的interver调用并没有给fn……
[/Quote]
uniond 2011-09-20
  • 打赏
  • 举报
回复
兄弟说的是,我要多学习才行,怎么解决?
[Quote=引用 5 楼 axiheyhey 的回复:]
这代码的逻辑和书写风格把我征服了。。
fn.ax1()是在循环前就已经调用了,而且只调用了一次,此时的a1=50,按照你的逻辑并不执行topx=a1;return topx,fnx自然是默认返回值undefined。。
[/Quote]
uniond 2011-09-20
  • 打赏
  • 举报
回复
对,要让this.ax1=function(){if(a1==639){topx=a1;return topx}不断的interval才能随时获得a1的值,那么怎么实现?
[Quote=引用 4 楼 gewei565 的回复:]
变量是肯定能访问到的
代码执行到fnx=fn.ax1()时你的ax1方法if条件不满足,是没有返回值的,所以得到的才是undefined,你后面的interver调用并没有给fnx再次赋值,所以它一直都是没有值的
另外你想要实现文本的移动的吧
document.getElementById("live1").style.top=a1+"px"
[/Quote]
峭沙 2011-09-20
  • 打赏
  • 举报
回复
这代码的逻辑和书写风格把我征服了。。
fn.ax1()是在循环前就已经调用了,而且只调用了一次,此时的a1=50,按照你的逻辑并不执行topx=a1;return topx,fnx自然是默认返回值undefined。。
「已注销」 2011-09-20
  • 打赏
  • 举报
回复
变量是肯定能访问到的
代码执行到fnx=fn.ax1()时你的ax1方法if条件不满足,是没有返回值的,所以得到的才是undefined,你后面的interver调用并没有给fnx再次赋值,所以它一直都是没有值的
另外你想要实现文本的移动的吧
document.getElementById("live1").style.top=a1+"px"
峭沙 2011-09-20
  • 打赏
  • 举报
回复
这代码的逻辑和书写风格把我征服了。。
fn.ax1()是在循环前就已经调用了,而且只调用了一次,此时的topx=a1=50,返回并赋值给fnx。。
uniond 2011-09-20
  • 打赏
  • 举报
回复
fnx是个全局变量,a1是局部变量,a1会递增到639,我要fnx的值也为639

我要用fnx去做个判断,所以必须要用fnx去获取a1这个局部变量的值

按道理来说,this.ax1=function(){if(a1==639){topx=a1;return topx}这个段代码可以让fnx获得a1为639的值,但是没成功,不知道怎么办了
001007009 2011-09-20
  • 打赏
  • 举报
回复
没明白是什么意思,程序是可以运行的。

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧