推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
click

[Javascript] 请问这两段代码有什么不一样吗?

  •  1
     
  •   click · Oct 12, 2014 · 4715 views
    This topic created in 4256 days ago, the information mentioned may be changed or developed.

    本人正在学JS,做一个标签切换效果,有个问题很久没搞不懂。

    mDD.length=2 请问这两段代码又什么不一样吗,测试效果不一样。

    代码1:

    for (var i=0;i<mDD.length;i++){
            mDD[i].addEventListener('mouseover',function(){onMou(i)});
    }
    

    代码2:

    mDD[0].addEventListener('mouseover',function(){onMou(0)});
    mDD[1].addEventListener('mouseover',function(){onMou(1)});
    

    代码1实现不了效果,换成代码2成功。

    22 replies    2014-11-09 18:50:48 +08:00
    willwen
        1
    willwen  
       Oct 12, 2014 via iPhone   ❤️ 1
    經典的閉包問題⋯Google "JavaScript 閉包 事件綁定",有你要的答案
    simonhtq
        2
    simonhtq  
       Oct 12, 2014
    1L正解
    ChJJin
        3
    ChJJin  
       Oct 12, 2014
    循环后,i为2,楼上说对了,闭包问题
    bombless
        4
    bombless  
       Oct 12, 2014
    经典问题…在闭包中你绑定的是变量而不是值。
    你需要在闭包外面再包一个闭包,然后把不变的量通过参数传过去。
    像这样:
    (function(j){ return function(){ onMou(j); }; })(i)
    newghost
        5
    newghost  
       Oct 12, 2014
    1的结果其实是这样的:

    mDD[0].addEventListener('mouseover',function(){onMou(1)});

    mDD[1].addEventListener('mouseover',function(){onMou(1)});
    newghost
        6
    newghost  
       Oct 12, 2014
    @newghost

    onMou(2)
    onMou(2)
    zhujinliang
        7
    zhujinliang  
       Oct 12, 2014 via Android
    对数组遍历建议使用forEach
    Automan
        8
    Automan  
       Oct 12, 2014
    @zhujinliang js里明显应该用for i
    sneezry
        9
    sneezry  
       Oct 12, 2014
    第一段代码里,i的作用域弄混了,for循环结束后i的值是个定值,无论哪个dom触发mouseover事件,后面函数里的i都是定值。
    Doubear
        10
    Doubear  
       Oct 12, 2014
    @bombless 闭包 这个名称是怎么来的?
    aa65535
        11
    aa65535  
       Oct 12, 2014
    chone
        12
    chone  
       Oct 12, 2014 via iPhone   ❤️ 1
    for不产生作用域,所以绑定的两个函数中的i在中一个作用域中,因此最终的值是一样的。
    zyue
        13
    zyue  
       Oct 12, 2014
    先unbound 下 再bound
    jianghu52
        14
    jianghu52  
       Oct 12, 2014
    所以一般来说,代码1里面通常会这么写
    var j = i
    mDD[j].addEventListener('mouseover',function(){onMou(j)});
    click
        15
    click  
    OP
       Oct 12, 2014
    v2ex帖子怎么实现代码着色的,我刚发的时候没有颜色的啊。
    Mutoo
        16
    Mutoo  
       Oct 12, 2014   ❤️ 1
    @jianghu52 这样写一样的,`j`和`i`在同一层闭包里。
    Jaylee
        17
    Jaylee  
       Oct 12, 2014
    ```
    for (var i=0;i<mDD.length;i++){
    (function(i){
    mDD[i].addEventListener('mouseover',function(){onMou(i)});
    })(i)

    }

    ```
    ChanneW
        18
    ChanneW  
       Oct 12, 2014
    经典
    Mutoo
        19
    Mutoo  
       Oct 12, 2014
    @click /t/127980 新建topic后,点击编辑,右下角多了个选项,文本标记语法,改为Markdown即可.
    bombless
        20
    bombless  
       Oct 13, 2014   ❤️ 1
    @Doubear closure,用来表达一种两个集合的包含关系
    cdxem713
        21
    cdxem713  
       Oct 20, 2014
    @Jaylee 昨天被面试官考了这个问题,他给的标准答案就这个
    click
        22
    click  
    OP
       Nov 9, 2014
    @Jaylee 谢谢!成功了,但还是无法理解

    (function(i){
    mDD[i].onmouseover=function(){onMou(i)};
    })(i);
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3006 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 07:11 · PVG 15:11 · LAX 00:11 · JFK 03:11
    ♥ Do have faith in what you're doing.