关于 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] 并不会改变
------解决方案--------------------
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;它们的值不同.