问题一:
function fn1() { let i=0; // 注意:只要这里一传递,到内部函数里面就变成了新的变量,及时改变外部变量,或者全局变量也不会改变。 fn2(i); console.log('fn1: ',i); } function fn2(i){ i--; console.log('fn2: ',i) } fn1() 结果: fn2: -1 fn1: 0
原因是基本数据类型
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的值,可以这样用全局变量的形式
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
当然也可以通过返回值进行修改。
// 略
问题二:
var a = { n: 1 };
var b = a;
a.x = a = { n: 2 }
a.x // -> undefined
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 }