1.執行環境前端
執行環境有全局執行環境(也稱全局環境)和函數執行環境之分。web
執行環境如其名是在運行和執行代碼的時候才存在的,因此咱們運行瀏覽器的時候會建立全局的執行環境,在調用函數時,會建立函數執行環境。瀏覽器
1.1全局環境函數
全局執行環境是最外圍的一個執行環境,在web瀏覽器中,咱們能夠認爲他是window對象,所以全部的全局變量和函數都是做爲window對象的屬性和方法建立的。代碼載入瀏覽器時,全局環境被建立,關閉網頁或者關閉瀏覽時全局環境被銷燬。spa
1.2函數執行環境code
每一個函數都有本身的執行環境,當執行流進入一個函數時,函數的環境就被推入一個環境棧中,當函數執行完畢後,棧將其環境彈出,把控制權返回給以前的執行環境。對象
2.1 全局做用域(globe scope)和局部做用域(local scope)blog
全局做用域和局部做用域中變量的訪問權限,實際上是由做用域鏈決定的.ip
每次進入一個新的執行環境,都會建立一個用於搜索變量和函數的做用域鏈。作用域
做用域鏈是函數被建立的做用域中對象的集合。
做用域鏈能夠保證對執行環境有權訪問的全部變量和函數的有序訪問。
做用域鏈的最前端始終是當前執行的代碼所在環境的變量對象(若是該環境是函數,則將其活動對象做爲變量對象),下一個變量對象來自包含環境(包含當前還行環境的環境),下一個變量對象來自包含環境的包含環境,依次往上,直到全局執行環境的變量對象。全局執行環境的變量對象始終是做用域鏈中的最後一個對象。
1.函數的局部環境能夠訪問函數做用域中的變量,也能夠訪問和操做父環境(包含環境)乃至全局環境中的變量。
2.父環境只能訪問其包含環境和本身環境中的變量和函數,不能訪問其子環境中的變量和函數。
3.全局環境只能訪問全局環境中的變量和函數,不能直接訪問局部環境中的任何數據。
3.做用域提高
3.1 變量提高
var name="haha"; 2 function changeName(){ 3 console.log(name); 4 var name="xixi"; 5 } 6 changeName(); 7 console.log(name); 輸出:undefined 和 haha
var name="haha"; 2 function changeName(){ 3 var name; 4 console.log(name); 5 name="xixi"; 6 } 7 changeName(); 8 console.log(name); 至關於上面代碼的解釋,變量提高
3.2函數提高
在JavaScript中函數的建立方式有三種:函數聲明(靜態的,像函數example1()的形式)、函數表達式(函數字面量)、函數構造法(動態的,匿名的)。
函數表達式:
var func1 = function(n1,n2){ 2 //function body; 3 };
函數構造法:
var func2 = new Function("para1","para2",...,"function body");
函數聲明:
//函數聲明 function myTest1(){ func(); function func(){ console.log("我能夠被提高"); } } myTest1();
輸出:我能夠被提高 //函數表達式 function myTest2(){ func(); var func = function(){ console.log("我不能被提高"); } } myTest2();輸出:object expected