使人頭疼的 arguments

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

相關文章
相關標籤/搜索