function positionMessage(){ var elem=document.getElementById("message"); elem.style.position="absolute"; elem.style.top="100px"; elem.style.left="50px"; moveElement("message",200,100,10); // movement=setTimeout("moveMessage()",5000);//movement在这里是全局变量,因此可以在函数以外的地方被取消 } addLoadEvent(positionMessage); function moveElement(elemID,final_x,final_y,interval){ //elemID传入为 "message" //传入时已经带有冒号,因此不能再传入冒号,否则无法获取元素ID的值 var elem=document.getElementById(elemID); var xpos=parseInt(elem.style.left); var ypos=parseInt(elem.style.top); if(xpos==final_x && ypos==final_y)return true; if(xpos<final_x)xpos++; if(xpos>final_x)xpos--; if(ypos<final_y)ypos++; if(ypos>final_y)ypos--; elem.style.left=xpos+"px"; elem.style.top=ypos+"px"; var repeat="moveElement('" + elemID + "'," + final_x + "," + final_y + "," + interval + ")"; movement=setTimeout(repeat,interval);//递归 }
我想问的是 为什么在第一次调用moveElement时参数elemID不需要带引号,而通过递归再次调用moveElement时elemID要加上引号了(即repeat中的单引号)。
我从网上已经查了,基本已经明白了加引号的目的是moveElement中的setTimeout的第一个参数必须是字符串。
但是我觉得有一个冲突是:
第一次调用moveElement时,传入的实参时带引号的message,即"message".所以在var elem=document.getElementById(elemID);这里,elemID不用加引号。之前代码一直不对就是这里加了引号导致效果显示不出来。
那既然传入的实参已经加了引号,那为什么再次调用moveElement时却要给elemID加一个单引号呢
第一次传入的实参是字符串,即 "message", 再次调用 var repeat="moveElement('" + elemID + "'," + final_x + "," + final_y + "," + interval + ")"; 里面 elemID 是一个对象,添加加引号,才会变为字符串