javascript - es6新特性的一点疑问
巴扎黑
巴扎黑 2017-04-11 12:09:45
[JavaScript讨论组]
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 是否在参数处赋值,最后结果却不同,不太明白,求解惑

巴扎黑
巴扎黑

全部回复(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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号