把setTimeout里面的那个 function(){snow()}改成:
arguments.callee
就可以了!
因为在外面的function函数体声明未结束之前,在setTimeout中调用它自已这个名称不行。
直接用arguments.callee代表当前函数自身。
另外看了下你的代码,Obj1.style.top返回的肯定是字符串值,例如“20px”,因此+=运算符是不能完成你要的操作的。你必须把它先转成数字。
例如:
Obj1.style.top =((parseInt(Obj1.style.top) || 0 )+2 )+"px";
这样才可以!
做JS脚本,你可以看一下开源js框架,名叫JSer,好用的。
1 函参是指函数定义中声明的参数,用于接收函数调用时传递的实参。2 函参的存在可以使函数具有通用性和灵活性,通过在函数定义时声明函参,可以在函数体内使用这些参数进行计算或处理。3 函参可以是任意合法的数据类型,可以是基本数据类型(如整数、浮点数、字符等),也可以是自定义的数据类型(如结构体、类等)。4 函参的数量和类型需要与函数的定义相匹配,调用函数时需要传递相应数量和类型的实参。5 函参的使用可以使函数具有更广泛的适用性,可以根据不同的实参值进行不同的处理,从而实现更多样化的功能。6 函参的使用也可以提高代码的可读性和可维护性,通过函参的命名和注释可以清晰地表达函数的意图和使用方法。函参的使用是函数编程中的重要概念,掌握函参的使用方法可以更好地理解和设计函数。在实际编程中,需要根据具体需求来选择合适的函参类型和数量,以便实现所需的功能。同时,需要注意函参的传递方式(值传递、引用传递等)和作用域(局部变量、全局变量等)对函数的影响。
arguments对象:函数内部对象,传入函数中所有参数的集合,类数组对象属性:callee 指针,指向拥有这个arguments对象的函数 作用:解耦例子:迭代 function factorial(num) {if(num<=1){return 1;}else{return ( num*arguments.callee(num-1));}}console.log(factorial(4));//24this对象:函数内部对象,引用的是函数执行的环境对象 在全局作用域执行函数时this为全局对象(window)window.color='red';var o={color:'blue',};function sayColor(){alert(this.color);};sayColor(); //redo.sayColor=sayColor;0.sayColor();//blue 看this引用的谁caller属性:指向调用当前函数的函数 保存着调用当前函数的函数的引用function a(){b();}function b(){alert(b.caller)}b();//输出a函数体apply()和call(): 作用:修改函数this的指向(修改上下文),拓展函数的作用域,对象与方法解耦 区别:传参 apply(要修改的指向,参数数组/arguments对象) call(要求改成的指向,arg1,arg2...)例子:哑巴说话function PersonWei() {}PersonWei.prototype={country:'Wei',sayCountry:function () {console.log('I am form '+this.country);},}var xuShu={country:'Shu',}var caoCao=new PersonWei();caoCao.sayCountry();// I am form WeicaoCao.sayCountry.call(xuShu); //I am form Shu不知道这样做合不合理,定义了一个表示魏国人的构造函数PersonWei(),它具有属性:country和方法sayCountry(),然后实例了一个caoCao(曹操),我们想要帮xuShu(徐庶)说出自己的国家: caoCao.sayCountry.call(xuShu);让caoCao的this指向变为xuShu(借尸还魂?脑洞大开,应该就是鬼上身,借用你的身体来实现他的行为),这时候this.conutry 中的this指向的就是xuShu对象了,因此结果是 I am form Shu
摘要:这里,我们看看如何浏览器对于JavaScript中处理大量数据。
在之前的文章中,我们讲了浏览器对于JavaScript代码执行的限制和基于计时器的伪线程机制。这里,我们再看看如何在JavaScript中处理大量数据。
在几年之前,开发人员不会去考虑在服务端之外处理大量的数据。现在这种观念已经改变了,很多Ajax程序需要在客户端和服务器端传输大量的数据。此外,更新doM节点的处理在浏览器端来看也是一个很耗时的工作。而且,需要对这些信息进行分析处理的时候也很可能导致程序无响应,浏览器抛出错误。
将需要大量处理数据的过程分割成很多小段,然后通过JavaScript的计时器来分别执行,就可以防止浏览器假死。先看看怎么开始:
function ProcessArray(data,handler,callback){ProcessArray()方法支持三个参数:
data:需要处理的数据handler:处理每条数据的函数callback:回调函数然后定义一些变量:
var maxtime = 100;var delay = 20;var queue = data.concat();maxtime表示每个处理进程的最大毫秒数。delay表示每个程序块之间的毫秒数。queue是源数据的复制,虽然不是在所有情景下都必要,但是我们是通过传递引用修改的,所以最好还是备份一下。
然后就可以使用setTimeout()方法来处理了:
setTimeout(function(){ var endtime = new Date() + maxtime; do{ hanler(queue.shift()); }while(queue.length>0 && endtime > new Date());首先,先计算endtime,这是程序处理的最大时间。do.while 循环用来处理每一个小块的数据,直到循环全部完成或者超时。
为什么使用do..while循环呢? JavaScript支持while和do…while循环。不同之处在于do..while循环回至少执行一次。如果使用while循环,那么当开发者设置一个很小或者很低的endtime值的时候,那么处理就根本不会执行了。
最后,我们再决定是否需要处理其他的数据,如果需要,那么就再调用一次:
if (queue.length > 0) { setTimeout(arguments.callee, delay); } else { if (callback) callback(); } }, delay);}这样回调函数会在每一个数据都处理结束的时候执行。我们可以通过ProcessArray()来测试一小组数据:
// Process an individual data itemfunction Process(dataitem) { console.log(dataitem);}// processing is completefunction Done() { console.log("Done");}// test datavar data = [];for (var i = 0; i < 500; i++) data[i] = i;// process all itemsProcessArray(data, Process, Done);这个方法在任何浏览器中都可以执行,不过HTML5提供了更好的办法,Rockux在以后的文章中会提到。
-----------河南新华
<!doctype html>
<html>
<body>
<canvas id="can" width="400" height="400" style="background: Black"></canvas>
<script>
var sn = [ 42, 41 ], dz = 43, fx = 1, n, ctx = document.getElementById("can").getContext("2d");
function draw(t, c) {
ctx.fillStyle = c;
ctx.fillRect(t % 20 * 20 + 1, ~~(t / 20) * 20 + 1, 18, 18);
}
document.onkeydown = function(e) {
fx = sn[1] - sn[0] == (n = [ -1, -20, 1, 20 ][(e || event).keyCode - 37] || fx) ? fx : n
};
!function() {
sn.unshift(n = sn[0] + fx);
if (sn.indexOf(n, 1) > 0 || n<0||n>399 || fx == 1 && n % 20 == 0 || fx == -1 && n % 20 == 19)
return alert("GAME OVER");
draw(n, "Lime");
if (n == dz) {
while (sn.indexOf(dz = ~~(Math.random() * 400)) >= 0);
draw(dz, "Yellow");
} else
draw(sn.pop(), "Black");
setTimeout(arguments.callee, 130);
}();
</script>
</body>
</html>
还没有评论,来说两句吧...