下面这一题来自 javascript-puzzlersjavascript
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。java
以个人理解简单非严格模式下,函数形参和arguments
绑定,两者不管谁修改,都会互相影响。git
可是,严格模式下,任何在函数体内的修改,或形参,或 arguments
只会影响本身,不会影响对方,能够修改下列代码试一试。github
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下,若是使用函数默认值,也会出现相似严格模式的效果。app
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/...code