下面這一題來自 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