每日一题12/13之非严格模式下arguments映射问题

先来个题目看看,事先说明,这种映射只存在于非严格模式下。

//题目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)

如果在严格模式下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值