js 奇怪的结果,很差解释的问题

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

相关文章
相关标签/搜索