日期:2014-05-16  浏览次数:20393 次

关于 arguments 的深奥问题
如下代码:
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]会变得不等呢?
哪位高手能解惑,在下将感激不尽!

------解决方案--------------------
先看一段代码:

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();

------解决方案--------------------
虽然你有 args = arguments
但 arguments 是只读的
尽管你 args[0] = 9 但 arguments[0] 并不会改变
------解决方案--------------------
引用:
虽然你有 args = arguments
但 arguments 是只读的
尽管你 args[0] = 9 但 arguments[0] 并不会改变


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
------解决方案--------------------
先测好再下结论嘛,经测试,ie6为false,firefox、chrome都为true
只能归结为浏览器的机制了,按道理true更合理
------解决方案--------------------
arguments存储的只是值引用,不是地址引用,修改后并不会修改实际的变量

    var a = 1
    var arr = new Array();
    arr[0] = a;
    arr[0] = 22;
    alert(a+','+arr[0])//1,22,而不是1,1

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