javascript變數的範圍

來源:互聯網
上載者:User

javascript變數的範圍
javascript變數的範圍  基本類型和參考型別   基本類型值指的是簡單的資料區段,而參考型別值指的是那個可能由多個值組成的對象  講一個值賦值給變數時,javascript解析器首先要確定是基本類型還是參考型別,基礎資料型別 (Elementary Data Type)可以直接操作儲存在變數中的值,而引用資料類型的值是儲存在記憶體中的對象,在操作對象是,實際上操作的是對象的引用而不是實際的對象   變數的賦值如果從一個變數上向另一個變數上複製__基礎資料型別 (Elementary Data Type)__的值,會在變數對象上建立一個新值,然後把該值複製到新變數的位置上,這個很好理解,來看下例子:   var num1 = 5; var num2 = num1; 上面代碼賦值的過程,如:     這是基礎資料型別 (Elementary Data Type),而參考型別呢?其實同樣會將原來變數上的值複製一份到新的變數當中,只不過,複製的其實是原來變數的一個指標,而這個指標指向儲存在堆中的一個對象。複製完成後,兩個變數都指向了堆中的同一個對象,所以改變其中一個的值,會對另外一個產生影響。有以下代碼   複製代碼var obj1 = new Object();  var obj2 = obj1;  obj1.name = "Nicholas";  alert(obj2.name);  //"Nicholas"複製代碼 那麼上面這段代碼執行的過程如:     傳遞參數 在javascript裡面,參數的傳遞都是按照`實值型別來傳遞`的,即使你傳入的是一個參考型別 function setName(obj) {         obj.name = "Nicholas"; }  var person = new Object(); setName(person); alert(person.name);    //"Nicholas" 上面代碼的返回結果貌似參數是參考型別的傳遞,因為開始person對象沒有屬性,調用了setName方法之後,給參數obj加上了name參數,然後外面的person列印person.name竟然是有值的,這是很明顯的引用傳遞的效果。但是不要被這種現象所迷惑,javascript在傳遞參考型別的參數的時候,只要這個參數不發生改變,那麼還是按照參考型別來處理,但是只有發生了改變效果就完全不一樣了   複製代碼function setName(obj) {          obj.name = "Nicholas";          obj = new Object();          obj.name = "Greg";  }   var person = new Object();  setName(person);  alert(person.name);    //"Nicholas" 複製代碼 上面的例子可以看出區別,如果真的是引用傳遞,那麼obj重新賦值,並且加上了name參數,最後person列印的應該是Greg的名字,但是結果卻是原來的值,只能說明javascript在這裡挖了一個大坑,非常的迷惑人,不過只要搞清楚這點就行了。  ##執行環境及範圍  > **執行環境**(execution context)定義了函數或者變數有權訪問的其他資料,決定了他們各自的行為,每個執行環境都有一個與之相關聯的變數對象,環境中定義的所有的變數和函數都儲存在這個對象中   全域執行環境是最外圍的執行環境,在web瀏覽器中,其實就是window對象,因此,**所有全域變數和函數,都是作為window的屬性和方法建立的,某個執行環境所有代碼執行完畢之後,該環境被銷毀,儲存在其中的變數和函數定義也隨之被銷毀(全域執行環境直到應用程式退出,及瀏覽器關閉的時候才會被銷毀)**     __每個函數都有自己的執行環境__,當程式執行到一個函數時,函數的環境會被建立出來,進入當前程式的流程,而在函數執行完成之後,程式流程將其彈出並銷毀,把控制權返回給之前的執行環境 當代碼在一個環境中執行時,會建立變數對象的__範圍鏈__,其根本意義就是在不同層級的執行環境中,保證各個執行環境中的變數有序訪問,看看下面的代碼: 複製代碼var color = "blue";   function changeColor(){          var anotherColor = "red";       function swapColors(){                  var tempColor = anotherColor;                  anotherColor = color;                  color = tempColor;          //在 swapColors函數裡面可以訪問tempColor,anotherColor和color               }      //在這裡可以訪問anotherColor和color,但不能訪問tempColor      swapColors();  }  複製代碼 可以更形象的看看下面的圖:      通過列子和圖,可以看出,內部環境可以通過範圍鏈訪問它之上的所有外部環境,但是外部環境不能訪問內部環境中的任何變數和函數。這些環境是線性,有次序的。   每個環境都可以向上搜尋範圍鏈,以查詢變數和函數名;而任何環境都不能通過向下搜尋範圍鏈而進入另一個執行環境  上面這段話非常重要,我們來看下例子: 複製代碼var color = "blue";   function getColor(){          return color;  }   alert(getColor());  //"blue" 複製代碼 很明顯,getColor函數裡面的color變數是從裡往外搜尋到上級外部環境的color得到的,:    在搜尋的過程中,如果出現同名的局部變數,這個搜尋就會停止: 複製代碼var color = "blue";   function getColor(){          var color = "red";          return color;  }   alert(getColor());  //"red"

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.