es6新特性的一点疑问

function sidEffecting(ary) {
  ary[0] = ary[2];
}
function bar(a,b,c) {  // c无赋值
  c = 10
  sidEffecting(arguments);
  return a + b + c;
}
bar(1,1,1)
function sidEffecting(ary) {
  ary[0] = ary[2];
}
function bar(a,b,c=3) {  // c=3
  c = 10
  sidEffecting(arguments);
  return a + b + c;
}
bar(1,1,1)

两段代码,差别只是 c 是否在参数处赋值,最后结果却不同,不太明白,求解惑

阅读 3.2k
2 个回答

这个应该是与严格模式有关use strict

在非严格模式下,改变argument的值,会同时改变对应参数的值!
在严格模式下不会这样。
所以第一个输出21是对的,如果函数开始 加一句“use strict” 就输出 12 了。

还没看 ES2015标准,只是看过点儿教程。下面说的不一定对。
ES2015 标准规定,如果使用了默认参数,如c=3,在函数里就不能显示的写use strict。可能这个时候浏览器会自动进入严格模式吧。因为这样也不会不兼容以前的代码,毕竟默认参数是ES2015里面的,如果同时规定这样的函数是在严格模式下也是没有什么问题的。

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

function f(a){
  "use strict";
  a = 42;
  return [a, arguments[0]];
}
var pair = f(17);
console.assert(pair[0] === 42);
console.assert(pair[1] === 17);

也就是说,你的第一段代码,修改agrs是会同步赋值到argumrnts对象的,同步为10
第二个,修改了也没用,arguments里面还是1

推荐问题