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 }

相關文章
相關標籤/搜索