令人头疼的 arguments

下面这一题来自 javascript-puzzlers

function sidEffecting(ary) {
  ary[0] = ary[2]
}
function bar(a,b,c) {
  c = 10
  sidEffecting(arguments)
  return a + b + c
}
bar(1,1,1)

上述的结果是什么?答案是21,当然这是非严格模式,如果严格模式,那么答案为12。

以我的理解简单非严格模式下,函数形参和arguments绑定,二者无论谁修改,都会互相影响。

但是,严格模式下,任何在函数体内的修改,或形参,或 arguments 只会影响自己,不会影响对方,可以修改下列代码试一试。

function test(a, b, c) {
    // 'use strict'
    var a = 4 
    console.log(a + b + c)
    // arguments[0] = 4
    console.log(arguments[0] + arguments[1] + arguments[2])
}

test(1,2,3)

严格模式下,参数的值不会随 arguments 对象的值的改变而变化。在正常模式下,对于第一个参数是 arg 的函数,对 arg 赋值时会同时赋值给 arguments[0],反之亦然(除非没有参数,或者 arguments[0] 被删除)。严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数。arguments[i] 的值不会随与之相应的参数的值的改变而变化,同名参数的值也不会随与之相应的 arguments[i] 的值的改变而变化。

有意思的是在ES6下,如果使用函数默认值,也会出现类似严格模式的效果。

function test(a, b, c = 3) {
    var a = 4 
    console.log(a + b + c)
    // arguments[0] = 4
    console.log(arguments[0] + arguments[1] + arguments[2])
}

test(1,2,3)

花了半个小时,发现自己以前对严格模式理解还有不足,以后这道题作为面试题还不错。

原文首发于我的github博客:https://github.com/isLishude/...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值