問題一:javascript
function fn1() { let i=0; // 注意:只要這裏一傳遞,到內部函數裏面就變成了新的變量,及時改變外部變量,或者全局變量也不會改變。 fn2(i); console.log('fn1: ',i); } function fn2(i){ i--; console.log('fn2: ',i) } fn1() 結果: fn2: -1 fn1: 0
緣由是基本數據類型java
function fn1() { let key = {i: 0}; fn2(key); console.log('fn1: ',key['i']); } function fn2(key){ key['i']--; console.log('fn2: ',key['i']) } fn1() 結果: fn2: -1 fn1: -1
改爲對象的形式就能夠2個函數都改變值了函數
想改變i的值,能夠這樣用全局變量的形式spa
let j=0 function fn3(){ fn4() console.log('fn3 j',j) } function fn4(){ j--; console.log('fn4 j',j); } fn3() 結果: fn4 j -1 fn3 j -1
固然也能夠經過返回值進行修改。 code
// 略
問題二:對象
var a = { n: 1 }; blog
var b = a;ip
a.x = a = { n: 2 }io
a.x // -> undefined console
b.x // -> { n: 2 }
解釋:
首先:. 的優先級 高於 =
a = { n: 1 } -> [棧地址a = 00XXX11] // 00XXX11 對應的值是 { n : 1 }
b = a -> [棧地址b = 00XXX11]
a.x = a = { n: 2 }
先執行 a.x : 00XXX11.x =從右到左賦值: [棧地址a = 00XXX11] -> [棧地址a = 00XXX22] // 00XXX22 對應的值是 { n : 2 }返回第一步: 00XXX11.x -> { n: 2 } // [00XXX11 = 00XXX22]因此: a.x 至關於 00XXX22.x => { n: 2 }.x 輸出: undefined ; b.x 至關於 00XXX11.x => { x: { n: 2 } }.x 輸出: { n: 2 }