基本概念執行環境定義了變數或函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有乙個與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中(開發者無法訪問,解析器在後台使用)
全域性執行環境是最外圍的乙個執行環境。web瀏覽器中,全域性執行環境被認為是window物件——因此,所有全域性變數和函式都是作為window物件的屬性和方法建立的。
某個執行環境中的所有**執行完畢後,該環境被銷毀,儲存在其中的所有變數和函式定義也隨之銷毀(全域性執行環境直到應用程式退出,如網頁關閉or瀏覽器關閉時才會被銷毀)
每個函式都有自己的執行環境。當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。而在函式執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。
當**在乙個環境中執行時,會建立變數物件的乙個作用域鏈,作用域鏈保證對執行環境有權訪問的所有變數和函式的有序訪問。作用域鏈的前端,始終都是當前執行的**所在環境的變數物件。如果這個環境是函式,則將其活動物件作為變數物件。活動物件在最開始時只包含乙個變數,即arguments物件(arguments物件在全域性環境中不存在)
識別符號解析是沿著作用域鏈一級一級的搜尋識別符號的過程。
延長作用域鏈執行環境的型別總共只有兩種——全域性和區域性(函式)
有些語句可以在作用域鏈的前端臨時增加乙個變數物件,該變數物件會在**執行後被移除。 a. try-cath語句的catch塊--建立乙個新的變數物件,其中包含的是被丟擲的錯誤物件的宣告 b. with語句--會將指定的物件新增到作用域鏈中
(with語句例項)
function
buildurl
() return url;
}複製**
with接收了location物件,因此其變數物件中就包含了location物件的所有屬性和方法。因此,其內部的href其實就是location.href。而url成了函式執行環境的一部分,所以可以作為函式的值被返回。
沒有塊級作用域宣告變數
使用var宣告的變數會自動新增在最近的環境中,在函式內部,最接近的環境就是函式的區域性環境;在with語句中,最接近的環境是函式環境。如果初始化變數時沒有使用var宣告,該變數會自動被新增到全域性環境。
function
()複製**
嚴格模式下,初始化未經宣告的變數會導致錯誤
查詢識別符號
let與塊級作用域
console.log(foo);//undefined
var foo = 2;
console.log(bar);//報錯
let bar = 2;
複製**
var tmp = 123;
if(true)
複製**
暫時性死區意味著typeof不再是乙個百分之百安全的操作
typeof x;//報錯
let x;
typeof undeclared_variable//undefined
複製**
塊級作用域與函式宣告
function
f()
(function
() } f();
}());
es5瀏覽器中執行:i am inside!因為將f提公升到了函式頭部
es6瀏覽器:報錯:
相當於function
f()
(function
() } f();
}());
複製**
// 不報錯
'use strict';
if (true)
}// 報錯
'use strict';
if (true)
function
f() {}
複製**
執行環境,作用域,作用域鏈詳解
宣告 該文章有些概念摘自 j ascript高階程式設計 1 執行環境 也稱 環境 執行環境定義了變數或函式有權訪問的其他資料,決定了他們各自的行為。全域性定義的變數,函式裡面可以訪問。一般情況下,函式裡面定義的變數,全域性無法訪問 2 全域性執行環境 全域性執行環境是最外圍的一直執行環境,在web...
執行環境和作用域鏈
執行環境定義了變數或函式有權訪問的其他資料,決定了它們各自的行為。每個執行環境都有乙個與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。全域性執行環境是最外圍的乙個執行環境。根據ecmascript實現所在的宿主環境不同,表示執行環境的物件也不同。在web瀏覽器中,全域性執行環境被認...
執行環境 作用域鏈及閉包
執行環境 execution context 定義了變數或函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有乙個與之關聯的變數物件 variable object 環境中定義的所有變數 形參和函式宣告都儲存在這個物件中。編碼時無法訪問這個變數物件,解析器在處理資料時會在後台使用。在web...