问题一: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 }