上次讨论了一段代码alert不出正常的值得问题 如下:$(function(){
    var nowurl = location.href;
    var urls = new Array();
    urls[0] = "Cambodia";
    urls[1] = "China";
    urls[2] = "English";
    urls[3] = "HongKong";
    urls[4] = "Thailand";
    urls[5] = "Vietnam";    
         
for (var i = 0; i < 6; i++) {
lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu").click(function(){
alert(lan); //这里的lan变量 值为NULL 如果直接放在click(alert(lan))就没问题
            })
                
            }后来修改为如下代码正常解决问题for (var i = 0; i < 6; i++) {
  lan = nowurl.match(urls[i]);
  if (lan != null){
    $("#langu").click((function(n){
       return function(){
          alert(n);
       }
     })(lan));
  }
}
他的原理就是:
for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
所以要通过全局变量或者闭包的形式把具体的值保存下来。
例子:
for循环作用域问题
以下程序会alert什么?  
答案是 2 , 2
其实理应让其alert 0,1才对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();
    } 
原理清楚了但是问题又来了,不是我不会思考其原因,因为小弟确实才接触这一行,很多小地方的细节和方法原理不太清楚
代码如下,这个代码跟第一段代码差不多大同小异,关键也是在for循环下的函数里面,不是说for循环时 和 click触发时 是不同的两个时间。 循环中的产生的变量i 在click时已经不存在了。
所以要通过全局变量或者闭包的形式把具体的值保存下来吗。

是不是我可以理解为for循环下的函数都不能保存值啦。但是却不是的下面代码的第一个函数可以正确alert出lan变量。
$(function(){
    var nowurl = location.href; 
    var urls = new Array();
    urls[0] = "Cambodia";
    urls[1] = "China";
    urls[2] = "English";
    urls[3] = "HongKong";
    urls[4] = "Thailand";
    urls[5] = "Vietnam";for (var i = 0; i < 6; i++) {
var lan = nowurl.match(urls[i]);
if (lan != null){
$("#langu li").each(function(index){
                //alert(lan); 如果在此处alert 是正确的
                //为什么在此处函数下可行,在下面函数就不行了啦。大概知道是变量作用域的问题,但是不太详细知道原理,求教......
$(this).click(function(){

alert(lan);  //但是在此处就不行 这个是上面已经论证了的
})

})

解决方案 »

  1.   

    咳,这是谁说的啊。楼主完全被误导了。
    lan = nowurl.match(urls[i]);
    //这里你直接写成lan='abc' 看看还为null吗,下面alert(lan)值为null是因为你没匹配到合适的值
      

  2.   

    //alert(lan); 如果在此处alert 是正确的
    这是因为 
    if (lan != null){
    alert(lan);
    //上面lan!=null 肯定不会输出null啦,但是for循环后lan变成了null
    (因为没有匹配到lan = nowurl.match(urls[i]))
    }
    这个lan的值一直指向 lan = nowurl.match(urls[i])
    nowurl.match(urls[i]) 的值是多少lan就是多少,最后一次循环如果没有匹配到的话,就为null