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 是否在参数处赋值,最后结果却不同,不太明白,求解惑
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这个应该是与严格模式有关
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
也就是说,你的第一段代码,修改
agrs是会同步赋值到argumrnts对象的,同步为10第二个,修改了也没用,
arguments里面还是1