iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
Modern Web

用30天了解javascript系列 第 15

[用30天了解javascript]Day15.範圍鍊(Scope Chain)

  • 分享至 

  • xImage
  •  

JavaScript 屬於靜態作用域,函式內沒有需要的變數時,會向外查找變數,如果找不到時會出現ReferenceeError: xxx is not defined

作用域

靜態作用域(又稱為語法作用域)

在語法解析的時候就已經確定作用域,已確定不會在改變

動態作用域

函式調用的時候才決定

執行環境

  • 全域:最外圍的執行環境,預設程式開始執行時的環境
  • 函式:每個函式都有自己的執行環境,當函式執行完,儲存的所有變數跟函式定義都會消失

執行堆疊

函式一層一層堆疊,與函式宣告沒有關聯性,與呼叫位置有關係,離開時也是一層一層的離開

var value = 1;
function a(){
	console.log(value); //1
	//在函式調用時才執行,會找上一層的變數
	//動態作用域:2
}
function b(){
	var value = 2;
	a();
}
b();

執行順序為

var value = 1; //全域變數1
f2(){} //執行f2();
var value = 2; //在f2()裡重新宣告變數等於2;再執行f1();
//但語法作用域,f2()執行完後,就結束
function f1(){} //f1()向外查找到全域變數1

執行環境

函式一層一層堆疊,離開時也是一層一層的離開
https://ithelp.ithome.com.tw/upload/images/20200915/20112053QNRYYLD5U8.jpg


上一篇
[用30天了解javascript]Day14.傳值與傳參考
下一篇
[用30天了解javascript]Day16.函式
系列文
用30天了解javascript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
fillano
iT邦超人 1 級 ‧ 2020-09-15 12:56:51

如果有closure,函式內可能會有變數不會消失。如果後面會提到這個的話,也許可以稍微提一下?

sunny iT邦新手 1 級 ‧ 2020-09-16 08:49:35 檢舉

謝謝大神的指導,我會在closure文章說明

我要留言

立即登入留言