资讯专栏INFORMATION COLUMN

令人头疼的 arguments

lanffy / 3036人阅读

摘要:以我的理解简单非严格模式下,函数形参和绑定,二者无论谁修改,都会互相影响。严格模式下,参数的值不会随对象的值的改变而变化。有意思的是在下,如果使用函数默认值,也会出现类似严格模式的效果。原文首发于我的博客

下面这一题来自 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/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88723.html

相关文章

  • element-ui日期时间选择器日期格式化问题

    摘要:最近在做的后台管理页面,其中用到了来选择日期时间,但是在将数据传回后台的过程中遇到了一些令人头疼的问题,在此记录一下解决方案,以免日后再次遇到。 最近在做vue+element-ui的后台管理页面,其中用到了DateTimePicker来选择日期时间,但是在将数据传回后台的过程中遇到了一些令人头疼的问题,在此记录一下解决方案,以免日后再次遇到。 showImg(https://segm...

    atinosun 评论0 收藏0
  • 30分钟掌握ES6/ES2015核心内容

    摘要:以下简称是语言的下一代标准。因为当前版本的是在年发布的,所以又称。用它所声明的变量,只在命令所在的代码块内有效。的继承机制,实质是先创造父类的实例对象所以必须先调用方法,然后再用子类的构造函数修改。 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。 也就是说,ES6就是E...

    LucasTwilight 评论0 收藏0
  • 30分钟掌握ES6/ES2015核心内容(上)

    摘要:以下简称是语言的下一代标准。的继承机制,实质是先创造父类的实例对象所以必须先调用方法,然后再用子类的构造函数修改。总结以上就是最常用的一些语法,可以说这的语法,在的日常使用中占了追加十分钟好的吗分钟掌握核心内容下 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。 也就是说...

    YPHP 评论0 收藏0
  • Javascript对象拷贝

    摘要:的对象只是指向内存中某个位置的指针。所以在拷贝中的对象时,要根据实际情况做一些考虑。结论中最好的对象拷贝的算法,很大程度上取决于其使用环境,以及你需要拷贝的对象类型。 翻译:疯狂的技术宅原文:https://smalldata.tech/blog/2... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 在开始之前,我先普及一些基础知识。Javascrip...

    simpleapples 评论0 收藏0
  • android高级工程师-阅读源码经验总结

    摘要:对于一个有追求的程序员来说必须读源码,当然阅读源码是一件令人头疼的事。和差不多,想法一样,但是和相比,搜索到的有价值结果不是很多,没有的理想,还有一些来着百度知道。 对于一个有追求的程序员来说必须读源码,当然阅读源码是一件令人头疼的事。阅读别人的代码远比自己写代码要难。Linus 是Linux的早期作者,一句影响深远的话是Read The Fucking Source Code(RTF...

    idisfkj 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<