第二節:執行環境與詞彙環境 == ###### tags: `JavaScript` ## <font color="#3733FF">全域環境與全域物件</font> 當我們看到JavaScript程式被執行時,是看到execution context執行環境被建立和執行,還會有base execution context 基礎執行環境,它也可以稱作是 global execution context 全域執行環境 在全域環境會創建兩個東西,一個是全域物件global object,另一個是特殊變數 this。 一般來說,在全域環境中this會指向window,因為我們在瀏覽器裡執行JavaScript,但如果我們是在伺服器執行node.js,會是個不同的物件。  在瀏覽器中,我們看到的就是window物件,還創造了this,,在全域中,這兩個東西是相同的,當程式碼或變數不在function裡面,就是全域物件 ## <font color="#3733FF">執行環境:creation and hoisting</font> ```javascript console.log(a) // undefined b() // Called b const a = "Hello" function b { console.log("Called b") } ``` 在creation階段裡,當語法解析器執行我們寫的程式碼,會知道我們在哪裡創造變數和函數,所以變數和函數被設定在記憶體裡,稱為Hoisting  他不是把程式碼移到最上面,而是在執行逐行程式碼之前,JavaScript已經為變數和函數在記憶體中建立一個空間了。 但變數比較不同的是,當它看到 = 等號,會先為a空出記憶體空間,但它還不知道會是什麼值,要等到被執行才知道,所以才會收到undefined 為了避免hoisting的問題,還是要寫成這樣比較好 ```javascript const a = "Hello" function b() { console.log("Called b") } console.log(a) b() ``` ## <font color="#3733FF">函數、環境與變數環境</font> ```javascript function b() { let myVar } function a() { let myVar = 2 b() } let myVar = 1 a() //undefined ``` 每個執行環境都有自己的變數環境,在呼叫b()時,這個變數沒有被設定成任何值,雖然myVar被宣告三次,但都是獨立的  逐一印出 ```javascript function b() { let myVar console.log(myVar) //undefined } function a() { let myVar = 2 console.log(myVar) // 2 b() } let myVar = 1 console.log(myVar) // 1 a() ``` ## <font color="#3733FF">The scope chain</font> 同樣的範例,不在function b 中宣告myVar,而是console.log,得到的myVar會是1 ```javascript function b() { console.log(myVar) // 1 } function a() { let myVar = 2 b() } let myVar = 1 console.log(myVar) // 1 a() ```  範例二: b是在a被執行時,創造出來的,所以a 是b的外部環境,b會是a的環境找有沒有變數myVar,我們會得到console.log是2,如果a裡面也沒有,才會到全域去找,這就叫scope chain ```javascript function a() { function b() { console.log(myVar) // 2 } let myVar = 2 b() } let myVar = 1 console.log(myVar) a() ```  ## <font color="#3733FF">關於非同步回呼</font> asynchronous : more than one at a time 非同步代表在一個時間點,可能有一段程式在執行時會開始執行另一段程式,然後又會再執行另一段程式,這些程式碼在JavaScript引擎內是同時在執行的  JS Engine內的等待列稱為event queue,裡面都是事件、事件通知,譬如click、Http Request,準備要發生的,所以當瀏覽器,有需要被通知的事件,就會在JS Engine內被放到佇列裡,而佇列裡的事件會等到執行堆空了才會處理事件
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up