本帖最后由 banuiss 于 2011-07-22 15:54:03 编辑

解决方案 »

  1.   


    for (var i = 0; i < 6; i++) {
      lan = nowurl.match(urls[i]);
      if (lan != null){
        $("#langu").click((function(n){
           return function(){
              alert(n);
           }
         })(lan));
      }
    }
      

  2.   

    for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
    所以要通过全局变量或者闭包的形式把具体的值保存下来。
      

  3.   

    for循环作用域问题,楼上正解以下程序会alert什么? 
    var arr = [];  
    for(var i=0; i< 2;i++){  
        var fn = function(){  
            alert(i)  
        }  
        arr.push(fn);  
    }  
      
    for(var j in arr){  
        var fn = arr[j];  
        fn();  
    }  
    var arr = [];
    for(var i=0; i< 2;i++){
    var fn = function(){
    alert(i)
    }
    arr.push(fn);
    } for(var j in arr){
    var fn = arr[j];
    fn();

    答案是 2 , 2其实理应让其alert 0,1才对这是因为第一个for循环里面创建函数fn的时候里面的i始终是在同一个作用域
    这样当循环2次后,又执行了一次i++,这时i等于2了. 因为是同一作用域,因此函数里面的i都是2
    要解决此问题,只需要创建一个闭包来实现就可以了,修改第一个for循环:var arr = [];  
      
    for(var i=0; i< 2;i++){        
        (function(j){         
            var fn = function(){  
                alert(j)  
            }  
            arr.push(fn);  
        }(i)); // 创建一个匿名函数并立即执行,传入参数i   
    }  
      
    for(var j in arr){  
        var fn = arr[j];  
        fn();  
    }  
    var arr = []; for(var i=0; i< 2;i++){
    (function(j){
    var fn = function(){
    alert(j)
    }
    arr.push(fn);
    }(i)); // 创建一个匿名函数并立即执行,传入参数i
    } for(var j in arr){
    var fn = arr[j];
    fn();
    }  这样就打印 0 1 了.因为闭包里面的参数j跟i不是在同一作用域