變量類型
ECMAScript變量可能包含兩種不同類型的數據值:基本類型和引用類型。
基本類型
基本類型指的是簡單的數據段,5種基本數據類型:undefined、null、boolean、number、string,基本數據類型是按值訪問的,因此可以操作保存在變量中的實際的值。
復制變量值
從一個變量向另一個變量復制基本類型的值,會在變量對象上創建一個新值,然后把該值復制到為新變量分配的位置上。例如:
var num1 = 5;var num2 = num1;
復制前的變量對象

復制后的變量對象

引用類型
引用類型指那些可能由多個值構成的對象,引用類型的值是保存在內存中的對象,JavaScript不允許直接訪問內存中的位置,在操作對象時,實際上是在操作對象的引用而不是實際的對象,因此,引用類型的值是按引用訪問的。
動態屬性
引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法。如果對象不被銷毀或者這個屬性不被刪除,則這個屬性將一直存在,但是我們不能給基本類型的值添加屬性。例如:
var person = new Object();person.say = "hello";alert(person.say); //"hello"
復制變量值
從一個變量向另一個變量復制引用類型的值時,也會將存儲在變量對象中的值復制一份放到為新變量分配的空間中,這個值的副本實際上是一個指針,而這個指針指向存儲在堆中的一個對象。復制結束后,兩個變量實際上將引用同一個對象,改變其中一個變量,就會影響另一個變量。例如:
var obj1 = new Object();var obj2 = obj1;obj1.say = "hello";alert(obj2.say); //"hello"

傳遞參數
ECMAScript中所有函數的參數都是按值傳遞的,把函數外部的值復制給函數內部的參數。在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量;在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量,因此這個局部變量的變化會反映在函數的外部。例如:
function addTen(num) { num += 10; return num;}var count = 20;var result = addTen(count);alert(count);  //20 alert(result);  //30執行環境及作用域
執行環境定義了變量或函數有權訪問的其他數據,決定了他們各自的行為。 
全局執行環境是最外圍的執行環境,在WEB瀏覽器中,全局執行環境被認為是window對象,因此全局變量和屬性都是作為window的屬性和方法創建的。 
每個函數都有自己的執行環境,當執行流進入一個函數時,函數的環境就會被推入一個環境棧中,在函數執行之后,棧將其彈出,將控制權返回給之前的執行環境。 
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈,作用域鏈的用途是保證對執行環境有權訪問的所有變量和函數的有序訪問。作用域鏈的前端始終是當前指行代碼所在的變量對象,作用域鏈中下一個變量對象來自外部環境,再下一個變量對象來自下一個外部環境,這樣一直延續到全局環境,全局執行環境的變量對象始終是作用域鏈的最后一個對象。 
標識符解析是沿著作用域鏈一級一級地搜索標識符的過程。搜索過程始終從作用域鏈的前端開始,然后逐級地向后回溯,直到找到標識符為止。 

內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變量和函數。
無塊級作用域
JavaScript中沒有塊級作用域,例如:
if(true){ var color = "blue";}alert(color);  //"blue"在函數中未使用var聲明的變量會被成全局變量,例如:
function add(num1,num2){ sum = num1 + num2; return sum;}var result = add(10,20);alert(sum);  //30以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答