来源:7-3 编程练习

阿西_0001

2014-07-17 16:49

为什么不能直接传递getStar(i)

写回答 关注

2回答

  • Thinker_Ac
    2014-12-13 13:56:32

    不明觉厉


  • Mr空
    2014-12-07 12:08:14

    这涉及到javascript中闭包,作用域,引用的概念。

    // 这段代码是错误的

    // 每个星星节点的点击事件

    for(var i=0;i<5;i++){

      stars[i].onclick=function(){

        getStar(i);

      }

    }


    当前作用域总是能够访问外部作用域中的变量。

    onclick函数总是能够访问到 window.onload 函数作用域中的变量i,

    但是onclick函数没有复制这个变量,只是引用了。


    onload函数执行完后,其中的变量i没有销毁,因为onclick函数引用了,

    但是这个时候循环已经执行完毕,i的值变成了5。


    当onclick函数触发执行时,获取变量i的值时,自然取到的是5,而不是星星对应的序号。



    解决办法:复制一份。

    // 每个星星节点的点击事件

    for(var i=0;i<5;i++){

    !function(index) {

    stars[index].onclick=function(){

    getStar(index);

    }

    }(i);

    }


    利用自执行函数,将i作为参数传入,index成为i的拷贝。

    再把index放入onclick函数中即可。


    更多关于闭包和作用域的知识,可参考javascript秘密花园文档:

    http://www.jb51.net/onlineread/JavaScript-Garden-CN/#function.closures


人人网评论功能

仿人人网评论,让你的网页活跃起来,赶快来学习让功能的实现吧

27691 学习 · 155 问题

查看课程

相似问题