function fn(arr) {
for (var i=0;i < arr.length;i++) {
arr[i]=function () {
document.write(i);
document.write(arr[i]); //为什么这里没有变成a,b,c?
};
arr[i]();
document.write("<br />");
}
}
var arr = ['a','b','c'];
fn(arr);

解决方案 »

  1.   

    亲,arr在fun里面是局部变量了,所以他不会去访问全局变量arr,fun里面定义的function,应用变量的时候也是逐步往上搜索,想查看fun里面有没有这个变量,如果有就不会去window你们查找,很明显function在fun你们就找到了arr,所以就忽略了全局的arr,会显示function的内容,不会显示abc了。
      

  2.   


      function fn(arr) {
    for (var i=0;i < arr.length;i++) {
    arr[i]=function () {
    alert(i+" | "+arr[i]);

    }; }
    }
    var arr = ['a','b','c'];     fn(arr);

    //alert (arr[0]);
    arr[0]();      /*
           输出 4 和 undefined
           为什么有4?
           fn内部的 i 在函数执行完后应该没有了才对啊      */
      

  3.   

    是输出3|undefined3 是i的值,闭包的问题undefined是因为你数组长度为3,下标从0开始,没有arr[3],所以arr[3]就是undefined了
      

  4.   


    js里面for语句没有单独作用域        for (var i=0;i < arr.length;i++) {
                arr[i]=function () {
                    alert(i+" | "+arr[i]);
                    
                };
    等价于:
            var i;
            for (i=0;i < arr.length;i++) {
                arr[i]=function () {
                    alert(i+" | "+arr[i]);
                    
                };
    这样写明白了么?
    你每个数组里面访问的i实际是同一个变量,for语句执行完以后,i=3,arr[0],arr[1],arr[2]调用时使用的i都是同一个变量,所以里面的i都是3.
    还有i在函数执行完之后没有被释放,原因是被还生存的变量持有,js里面只有资源没有被生存期的变量持有时才会自动释放
      

  5.   

    要的就是这句话
    最后一点,
      alert(i+" | "+arr[i]);
    arr[i] 不会变成a,b,c的原因二楼讲清楚了。
    但是为什么前面的i也没有变成0,1,2我以为fn(arr);之后,arr数组的成员应该是这样arr = ['alert(0+" | "+arr[i]);',
           'alert(1+" | "+arr[i]);',
           'alert(2+" | "+arr[i]);']但它却是这样arr = ['alert(i+" | "+arr[i]);',
           'alert(i+" | "+arr[i]);',
           'alert(i+" | "+arr[i]);']
      

  6.   

    再改一下function fn(arr) {
            for (var i=0;i < arr.length;i++) {
                arr[i]=function () {
                    alert(i+" | "+arr[i]);
                    
                };
                arr[i]();   //这里就执行一次
            }
        }
        var arr = ['a','b','c'];    
        fn(arr);
    应该是这样,fn(arr)后,arr成员是这样arr = ['function(){alert(0+" | "+arr[i]);}',
           'function(){alert(1+" | "+arr[i]);}',
           'function(){alert(2+" | "+arr[i]);}']
    在arr[i](),这句输出  0 | function () {  alert(i+" | "+arr[i]); }
      1 | function () {  alert(i+" | "+arr[i]); }
      2 | function () {  alert(i+" | "+arr[i]); }
    也就是fn函数的第4行,i 被 解释为当前的index 0,1,2,
    arr[i] 解释成为function () {  alert(i+" | "+arr[i]); }
    而这个匿名函数里的变量没有被解释。还是原来的语句。js在解释变量有什么规则吗
      

  7.   

    什么规则,规则刚刚都说了,不要把什么都推给特殊规则,仍然是逻辑不清的问题......
    我说过了,for语句执行后i的值为3,不是执行过程中就已经是3了,不要混淆
    这个和上面的是不同的,这是在循环过程中输出的,而前面是在循环完之后输出的自己好好分析 alert执行的时候i的值
      

  8.   

    你说的问题我已经懂了,
    楼上我说的是,js在解析代码时,把变量和它的值相关联,
      alert(i+" | "+arr[i]);
    i      变成0 / 1 / 2
    arr[i] 变成 function () {
                    alert(i+" | "+arr[i]);
                };
    换个例子function f(arr) {
        var i=2;
    var j='a',k = 'b';  
    arr[i] = function(){alert(i);alert(j);alert(k);alert(arr[i]);} /*alert(arr[i]); 所指向的函数内部的变量没有被解释*/
    };arr =  [1,2,3]
    f(arr);
    arr[2]();
      

  9.   

    我一看就知道弹出的值依次是
    2
    a
    b
    function(){alert(i);alert(j);alert(k);alert(arr[i]);}你如果想alert(arr[i])时再执行一次函数
    应该写成alert(arr[i]())不过这样就无限递归了
    alert(arr[i])的执行过程是调用arr[i].toString()方法,将返回的字符串弹出,不是执行函数,所以当然不会执行其中的代码,真不知道你是怎么思考的
    都是逻辑简单的问题,需要你自己思考搞清楚,给你解释你不思考也没用