西西河

主题:【原创】在settimeout里实现函数中的参数传递 -- 铁手

共:💬4 🌺12 新:
全看树展主题 · 分页
家园 【原创】在settimeout里实现函数中的参数传递

举个简单例子,比如在网页编程中,如果在页面中有个 button,点击后,希望这个button的值每1秒钟追加一个 * ,该怎么实现?

可能会首先想到的是

<form>

<input type="button" onclick="ClickButton(this)">

</form>

==

function ClickButton(Button){

Button.value+="*"

setTimeout(ClickButton(Button),1000);

}

虽然直观,但是这种参数传递的方式是不行的。因为那个 Button 的值会消失。

解决的方法,是在 setTimeout 的时候,用一个 function 来包含上面的这个函数。

function ClickButton(Button){

Button.value+='.';

setTimeout(function(){ClickButton(Button);Button=null;},1000);

}

Button=null 是为了防止 ie 中可能出现的 memory leak

另外一种变通办法就是用全局参数,就不用考虑参数传递的问题。

家园 此处有宝

恭喜:你意外获得【通宝】一枚

鲜花已经成功送出,可通过工具取消

提示:此次送花为此次送花为【有效送花赞扬,涨乐善、声望】。

家园 就是传个闭包函数嘛
家园 非常简单

button.onclick = function(){

var self = this;

if(self.timer) {

clearTimeout(self.timer);

self.value = '';

}

self.timer = setTimeInterval(function(){

self.value+='*';

}, 1000);

}

//prevent IE6/7 memleak

window.onpreunload = function(){

button.onclick = null;

}

self在这里是个closure scope的变量,直接传过去.

如果用addEventListner就不用考虑memleak.建议desktop使用jQuery,mobile使用zeptos,这样省你很多事情

全看树展主题 · 分页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河