如下代码:
var gfn;
function Enclosure(a,b) {
    var args = arguments;
    gfn = function(){
        args[0] =9;  // 如果该行被注释掉,结果竟完全相反
        alert (args[0] == a);  // 按理说,a 即闭包函数Enclosure()的arguments[0]呀!
    }
}   
Enclosure("1","2");
gfn();运行结果:输出0,也就是false。
问题:为什么args[0]与arguments[0]会变得不等呢?
哪位高手能解惑,在下将感激不尽!

解决方案 »

  1.   

    先看一段代码:var f = function(a){
        arguments[0] = 1;
        alert(a);//这里,不管调用时传递什么参数,都弹出1,因为上一行代码修改了这个值。
    }
    f(2)你的代码:var gfn;
    function Enclosure(a,b) {
        var args = arguments;
        gfn = function(){
            args[0] = 9;  
            alert(args[0] + ' ' + a);
            alert (args[0] == a);  // 这里永远都弹出true,不管那行有没有注释,除非那行注释且参数是NaN常量。
        }
    }   
    Enclosure("1","2");
    gfn();
      

  2.   

    楼上的兄弟,输确实出为false,不信你运行一下
      

  3.   

    帖下完整程序,在Windows下存为“a.js”直接点击即可运行:function alert(s){
    WScript.Echo(s);
    }
    var gfn;
    function Enclosure(a,b) {
        var args = arguments;
        gfn = function(){
            args[0] =9;  // 如果该行被注释掉,结果竟完全相反
            alert (args[0] == a);  // 按理说,a 即闭包函数Enclosure()的arguments[0]呀!
        }
    }   
    Enclosure("1","2");
    gfn();
      

  4.   

    虽然你有 args = arguments
    但 arguments 是只读的
    尽管你 args[0] = 9 但 arguments[0] 并不会改变
      

  5.   

    斑竹兄弟,arguments不是只读的。请运行这个:
    function alert(s){
        WScript.Echo(s);
    }function Enclosure(a,b) {
         arguments[0] =9;
         alert (a)
    }    
    Enclosure("1","2"); 输出为“9”而不是“1”
      

  6.   


    var gfn;
    function Enclosure(a,b) {
        var args = arguments;
        args[0] =9;
        console.log(args);
        console.log(arguments);

        gfn = function(){
            args[0] =9;  // 如果该行被注释掉,结果竟完全相反
            alert (args[0] == a);  // 按理说,a 即闭包函数Enclosure()的arguments[0]呀!
        }
    }   
    Enclosure("1","2");
    gfn();冒似arguments 不是只读的
    不知道LZ的是什么浏览器的,为什么我的一直都是true呢。args[0]一直等于a
      

  7.   

    噢!你是对的 arguments 不是只读的
    但 arguments 只是函数的参数的副本而不是引用至少在 IE 中是这样的
      

  8.   

    我用的不是浏览器,是在win2003系统带的WScript.exe和mshta.exe上,运行的未编译JScript脚本和hta程序,都是这个结果。莫非是系统bug?
      

  9.   

    先测好再下结论嘛,经测试,ie6为false,firefox、chrome都为true
    只能归结为浏览器的机制了,按道理true更合理
      

  10.   

    arguments存储的只是值引用,不是地址引用,修改后并不会修改实际的变量    var a = 1
        var arr = new Array();
        arr[0] = a;
        arr[0] = 22;
        alert(a+','+arr[0])//1,22,而不是1,1
      

  11.   

    关键在于args[0] =9这句;将9赋值给了args[0],而原args[0]值为1;它们的值不同.
      

  12.   

    这里arguments[0]与参数a是等价的,就象引用一样,一个改变就会影响另一个。但内部函数无法访问外面闭包函数的arguments,所以我用一个局部量args来摆渡。但结果令人费解。
      

  13.   

    arguments[0]是形参a的引用,但不影响实参
      

  14.   

    话说,不提倡在函数内部修改arguments对象的任一属性,本来这个对象是用来接受调用时传递的参数,但却在函数内部修改了这个对象,那传递来的参数是不是没用了?是不是有些不妥?!这个对象将失去它的存在意义。
      

  15.   

    谢谢大家的参与。感觉IE的实现很怪异,var args = arguments; 对它而言意味着不同于别人的特殊做法,真没法想象。