先来个题目看看,事先说明,这种映射只存在于非严格模式下。
//题目1
var a = 4;
function b(x, y, a) {
console.log(a);
arguments[2] = 10;
console.log(a);
}
a = b(1, 2, 3);
console.log(a);
//题目2
function fn(x,y){
let arg=arguments
x=100
console.log(arg[0]);
arg[1]=50
console.log(y);
}
fn(10)
接下来是一步步地分析
/*
变量提升var a ,function b(){},b的[[scope]]:EC(G),
代码执行:a=4,a=b(1,2,3)把b执行返回的结果赋值给a,如果没有返回值,a就是undefined
执行b,创建一个私有上下文EC(b),初始化作用域链<EC(b),EC(G)>,初始化arguments:{0:1,1:2;2:3},
形参赋值:x=1, y=2, a=3;变量提升:无。此时x,y,a与arguments中的每一项建立起一个一一映射关系,
其中一个改变,另外一个会随即改变。只有当形参和实参一一对应的时候,这种映射关系才成立。
*/
var a = 4;
function b(x, y, a) {
console.log(a);
arguments[2] = 10;
console.log(a);
}
a = b(1, 2, 3);
console.log(a);
答案如下,你做对了吗?
第二个题目,分析如下
fn(10)实参只有10,但是形参有x,y两个,所以arguments的映射关系不成立,
可以理解为,arguments是单独的一个内存,里面存放形参,arg:{0:100;length:1}
arg[1] = 50即给arg添加成员,arg变成arg:{0:100;1:50;length:2}
但是这和形参y没有任何关系,y仍然是undefined
*/
function fn(x, y) {
//x ->100 , y -> undefined
let arg = arguments
x = 100
console.log(arg[0]);
arg[1] = 50
console.log(y);
}
fn(10)
如果在严格模式下: