博文

目前显示的是标签为“語法作用域”的博文

JavaScript 核心觀念(6)-執行環境與作用域-範圍鍊

图片
嗨~大家好,我是Kris 今天要來說明 為什麼明明宣告在外層的變數甚至是不同地方的函式,卻可以正確的呼叫與執行。 範圍鍊 函式裡面沒有需要的變數時,就會向外層尋找 變數在外層宣告,但內層卻可以取得 JavaScript是語法作用域,所以並不會與執行堆疊有任何關係。 因此fu1()不會因為他是在fu2()下被呼叫 就去尋找fu2()裡的var value = 2;     而是會去外層尋找外面的var value =1;。 範圍鍊真正的意思是「當函式本身沒有相對應的變數或函式時,就會向外層去尋找」 而這個尋找的過程就是【範圍鍊】,因此這邊與執行堆疊、執行環境不會有任何直接關係。 JavaScript 因為是語法作用域的關係,在程式碼撰寫完畢時,就已經決定了作 用域。 以下提供幾個範例,大家可以跟著做做看哦 不同情況下分別會列印出什麼呢? 答案放在最下方 1. 2. 3. 4. 5. 解答分隔線 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.  哈囉~老媽 2.  哈囉~老媽 3.  哈囉~漂亮阿姨 4.  哈囉~老爸 5.  哈囉~老媽 //1. 只執行sayHi(),sayHi()裡沒有person此變數,因此向外層尋找,找到全域變數的'老媽' 其他兩個fn裡的變數皆是區域變數,不影響sayHi() //2. doMorningWork()裡的變數為區域變數,不影響sayHi(); *函式沒有被呼叫就不會執行哦,所以meetAuntie()不會執行 //3. 執行meetAuntie()時內部有person,故印出'漂亮阿姨' 不被doMorningWork()的'老爸'影響 //4. 執行meetAuntie()時內部沒有person變數,所以向外層doMorningWork()尋找所以印出'老爸' //5. 執行meetAuntie()時內部沒有person變數,所以向外層doMorningWork()尋找也找...

JavaScript 核心觀念(3)-的語法作用域(Lexical scope)

图片
 嗨大家好嗎? 我是Kris,今天要來跟大家講一個我覺得很重要的東西 算是解題時很常用到的基本觀念哦~ 相信大家應該多少都有聽過全域變數、區域變數吧 今天要來講的語法作用域就跟這個有關係 讓我們開始吧! JS是採用語法作用域,那什麼是語法作用域呢? 就是我們定義的變數能夠發揮功能的區域! 接下來可以跟著動手做做看 圖1 建立一個function 叫做callName 在函式內定義變數Ming並且給予'小明'的值 再用console.log列印出Ming的值。 在主程式呼叫callName(); //這樣callName這個function才會運行 會得到結果:上方圖1右方網頁上反白的資料(會印出小明) 接著假設我們把 console.log那一行移至呼叫callName(); 的下一行 如同下圖2 圖2 會得到結果:圖2右方網頁上寫著錯誤訊息-Ming is not defined(Ming未定義) 這是因為JS有語法作用域的關係 因此var Ming = '小明' 能夠發揮功能的區域只在callName這個function內(大括號{}裡面) 在外層是讀不到的,這就是因為作用域的關係~ 語法作用域也跟JS怎麼運行有很大的關係 講到語法作用域呢會牽扯到靜態作用域&動態作用域 靜態作用域也就是語法作用域(JS使用的) 指的是在語法解析什就確定能夠發揮功能的區域(就像上面例子寫callName函式時就確定了) 而動態作用域指的是在函式被調用的時候才會決定作用域 重點筆記👇 靜態作用域 變數的作用域在語法解析時,就已經確定作用域,並且不會改變。 動態作用域 變數的作用域在函式調用時才決定。 JS的作用域是一層一層向內的 最外層有一個全域的作用域,內層是由function所包住(全域作用域所定義的變數=全域變數) 如下圖,callMe和fn2就是兩個獨立的作用域 如果內層作用域有需要一些變數,但是此作用域內沒有這個變數的時候 就會向外查找,找到的話就會拿來使用 找不到時就會出現 變數is not defined 的錯誤訊息 接下來用程式碼來解釋一下靜態作用域&動態作用域 先將剛剛的code註解,再來打新的code 首先定義變數value = 1 再建立兩個function分別是fn1()和fn2() fn1()裡使用cons...