javascript 闭包 和 函数异步执行的举例

<style type="text/css">
#a1{
background:url(img/Alaphabet-d.jpg);
background-repeat:no-repeat;
background-position:0px -0px;
height:210px;
width:210px;
}

这个css 显示一副大图(字母表)的一部分(每个字母)

用 javascript 控制显示

有两种写法

第一种写法,是我的写法,传参进入 setInterval 中,直接返回一个带参数的函数

function change1(x_i){
if(document.styleSheets[0].cssRules){
document.styleSheets[0].cssRules[0].style["background-position"]="-0px -"+String(215*x_i)+"px";
}
}
function load(){
var i=0;
setInterval(function(){i++;j++; if(i==5) i=0;if(j==5) j=0; change(i,j);},2000);


第二种写法,很有意思

javascript 是异步执行,把所有函数都扔到一个堆栈里,顺序执行

function change1(x_i){
if(document.styleSheets[0].cssRules){
document.styleSheets[0].cssRules[0].style["background-position"]="-0px -"+String(215*x_i)+"px";
}
}
function load(){
var i=0; j=2;
for(i=0;i<50;i++){
( [color=red][b]function(){var j=i;setTimeout(function(){change1(j%5);},1000*j); } )();[/b][/color]
}

}


这个红色字体为什么不能写成下面呢?
var j=i;
setInterval(function(){change1(j%5);},2000);

因为不用闭包包起来,就不能形成自己的作用域,j 值就是变化的

为什么不能写成下面这样呢?
(function(){var j=i;setTimeout(function(){change1(i%5);},1000*j); } )();

首先用 function(){ }() 括起来,就形成了一个自己的域
用j=i ,在此域内获得i 值, 堆栈中的值是存入每次变化的参数

如果直接传参数为i

程序会首先执行完循环, 把函数扔到堆栈中,然后拿出来执行,当执行的时候,i 已经循环结束,为循环最后一个值, 这时候所有的函数参数都一样的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值