问答详情
源自:8-5 计时器setTimeout()

关于setTimeout调用中的这个函数问题

看书遇到遇到这样一个问题。

function shakeWin(stepId){

    var stepId;

    if(!stepId)stepId=0;

    switch(stepId){

            case 0: window.moveBy(-5,-5);break;

            case 1: window.moveBy(10,0);break;

            case 2: window.moveBy(-10,-10);break;

            case 3: window.moveBy(10,0);break;

            case 4: window.moveBy(-5,-5);    break;

            default:return;

}

        stepId++;

        setTimeout("   shakeWin(  "+stepId+"  )    ;",20);

}

setTimeout("   shakeWin(  "+stepId+"  )    ;",20)

调用shakeWin函数时,这个参数是什么意思。为什么加了双引号有加+号??

提问者:无敌小哥儿 2016-10-07 21:34

个回答

  • fdsgasgg
    2016-10-08 10:41:30
    已采纳

    双引号包裹的是前面   shakeWin( 这一句,+stepld+是字符串操作,为了和前后的字符串组合成setiomeout中的函数名.stepld是变量 ,例如如果此时stepld的值为1拼接后就是("shakeWin( 1);",20)

  • CrazyQueen
    2016-10-19 09:26:00

    我认为if(!step)step=0;这句话不是判断类型而是判断有无传入值,没有传入参数则赋值为0,有传入参数则直接运行下面的代码。如果你是只把!去掉,变成:if(step)step=0;的话,只要你有传入参数就会被赋值为0,而没有传入参数的话,step为undefined,那么后面的代码就运行不起来了。而当你加回!后,传入参数7,由于switch里的case只进行了0-4的判断,7的值会执行default的内容。

  • 无敌小哥儿
    2016-10-09 20:32:55

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>窗口抖动</title>
    <script type="text/javascript">
    function shake(step){
    var step;
    if(!step)step=0;
    switch (step){
    case 0: moveBy(-5,-5);break;
    case 1: moveBy(10,0);break;
    case 2: moveBy(-10,10);break;
    case 3: moveBy(10,0);break;
    case 4: moveBy(-5,-5);break;
    default : return;
    }
    step++;
    setTimeout("shake("+step+")",20);
    }
    </script>
    </head>
    <body>
    <input type="button" onclick="shake()" value="点我抖动窗口">
    </body>
    </html>


  • CrazyQueen
    2016-10-08 10:50:00

    http://img.mukewang.com/57f85bc20001131804730026.jpg

    图上的颜色其实已经很明确的说明了为什么加了双引号又加+号了。

    黄色部分是这个计时器要执行的函数名称,而红色加号中间的stepId是参数,传入黄色字符函数的参数。至于这个参数是什么意思,估计你要结合书里前后的代码内容看看。

    如何你不使用加号,这个参数的值就变成了“stepId”,意义不同了。

    这段代码就是一个带传入参数的计时器,里面有一个根据传入参数不同执行不同内容的判断(switch那段)。