javascript變數賦值或者重新賦值注意事項

admin發表於2017-03-31

變數賦值是javascript程式碼編寫過程中最為常見的操作,看如下程式碼:

[JavaScript] 純文字檢視 複製程式碼
var num=1;

上面的程式碼是多麼的簡單平凡,沒啥好說的,繼續看一段程式碼:

[JavaScript] 純文字檢視 複製程式碼
var obj={
  webName:"螞蟻部落",
  url:"softwhy.com"
}

上面的這個程式碼也是如此的簡單,但是其實兩者的區別還是很大的。

第一個程式碼變數中儲存的內容值型別的,儲存變數的位置也是儲存值的位置,都位於棧中。

第二個程式碼變數中儲存的內容是引用型別的,變數中儲存的僅僅是物件在堆中的記憶體地址,變數位於棧中,但是物件卻位於堆中。

再來看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼
var obj={
  webName:"螞蟻部落",
  url:"softwhy.com"
}
obj=function (param){
  return function(){
    return param
  }
}(obj)
console.log(obj().webName);

上面的程式碼中輸出值是"螞蟻部落",也許有不少朋友認為,既然obj物件已經變成函式了,為什麼還是能夠正確的傳遞引數,並且輸出相應的屬性值,下面就分析一下這方面的原因。

1.var obj={

  webName:"螞蟻部落",

  url:"softwhy.com"

},建立一個物件直接量,變數obj儲存的是物件的引用,可以理解為物件在堆中的記憶體地址,但是變數obj位於棧中。

2.obj=function (param){

  return function(){

    return param

  }

}(obj),上面的程式碼總體上是一個賦值語句,等號兩端是兩個表示式,首先會計算右側的表示式的值,這個時候為匿名函式傳遞的obj的值依然是指向物件直接量的引用(傳遞引數obj的時候其實是在棧中對變數做了一個複製),然後返回一個函式物件並賦值給變數obj,這個時候obj儲存的內容已經變為指向函式物件的引用。

3.obj().webName,obj()執行的時候返回的是一個儲存指向物件直接量的引用的變數,於是obj().webName返回"螞蟻部落"。

相關文章