iT邦幫忙

0

為了轉生而點技能~day1:javascript 起手篇(RHS、LHS、語法作用域

本系列是為了轉生,為了點技能而解任務的攻略提示,皆無營利、亦非營利取向。

  1. Javascript:屬於直譯式語言
    * 直接利用直譯器產出,故電腦只能透過直譯器觀測。
    * 不用定義型別。

https://ithelp.ithome.com.tw/upload/images/20211119/201437627jcQD6gvFZ.jpg

var ming = '小明' 所生成的樹顯示 variableDeclaration:建立一個變數的 ming

ming = '小明'所生成的樹是顯示 assignmentExpression:建立一個 ming 屬性

JS是用' '號,Java是用""來包裹string。
https://ithelp.ithome.com.tw/upload/images/20211119/201437627KErBDKYP0.jpg

var ming = '小明':'小明'是賦值予變數ming,屬於LHS。

var man = ming : ming是賦值予變數man,屬於LHS。

console.log(ming) :console.log需要變數ming的值,向右尋找得'小明',屬於RHS。

LHS錯誤:https://ithelp.ithome.com.tw/upload/images/20211119/20143762xLTT2wzd0N.jpg

console.log(ming) 改成console.log(min) :
RHS錯誤:https://ithelp.ithome.com.tw/upload/images/20211119/20143762ZqPHuqktJk.jpg


js之語法作用域(lexical scope):

靜態作用域,變數在語法解析的時候就確定了作用的範圍;動態作用域,變數在函式調用的時候才確定。
JS屬於靜態作用域。

https://ithelp.ithome.com.tw/upload/images/20211119/20143762OJJSZWwp8k.jpg

靜態作用域:
fn2()為多少?
雖然function fn2()裡面已經有宣告value,但是function fn1()的裡面並無宣告value,
造成為了執行console.log(value)而去尋找外部的 value = 1。

動態作用域:
fn2()為多少?
雖然function fn2()裡面已經有宣告value,但是function fn1()的裡面並無宣告value,
造成為了執行console.log(value)而去尋找上一層函式function fn2()的 value = 2。

  1. var的作用域:
  • 變數有效範圍的最小單位是以 function 做分界。
  • 函式區塊內透過 var 定義的變數實際上只屬於這個函式。
  • 如果函式內沒有定義變數,則會向外尋找,直到全域變數為止。
  • function 內沒有重新宣告變數,則會function 內的變數值,跑去變更了外層的同名變數 x的值。
var x = 1;

var doSomeThing = function(y) {
  x = 100;
  return x + y;
};

console.log( doSomeThing(50) );   // 150
console.log( x );                 // 100
var x = 1;

var doSomeThing = function(y) {
  var x = 100;
  return x + y;
};

console.log( doSomeThing(50) );   // 150
console.log( x );                 // 1
  1. ES6 之後有 let 與 const 分別定義「變數」與「常數」。 與 var 不同的是,它們的作用域是透過大括號 { } 來區分。


執行堆疊(execution stack):
指的是函式運行的時候會創造一個執行環境,執行環境則會依照函式的運作順序,先執行先堆。
EX:
https://ithelp.ithome.com.tw/upload/images/20211119/20143762Istmtsq9ON.jpg

推疊順序:

  1. 全域執行環境(沒有函式執行的時候,就已經先有的) -> 2. 執行doSomething() -> 3. 執行sayHi()
    https://ithelp.ithome.com.tw/upload/images/20211119/20143762PhQKXrt1nf.jpg

範圍鍊(scope chain):

意思是「當函式的本身沒有相對應的變數或函式時,他就會向外層去尋找」,因此這一個向外尋找的過程與執行堆疊以及執行環境並不會有任何直接關係。

https://ithelp.ithome.com.tw/upload/images/20211119/20143762Aqy7mF5MmP.jpg


提升(hoisting):

var a = '1';

當尚未開始執行的時候,只是先創造環境給變數a,等於在記憶體空間中騰出位置給變數a;當開始執行的時候才會在記憶體上給'1'這個數值。

先創造環境給變數a,等於在記憶體空間中騰出位置給變數a的過程,就是hoisting。

var a = '1';
function fn(){
......
};

若是函式(這邊的函式是函式陳述式/函式逆名式)的創造階段,記憶體空間中騰出位置給函式名fn(),且函式的陳述式function fn()亦會先行載入於記憶體。

https://ithelp.ithome.com.tw/upload/images/20211119/201437627cYLpKvLbh.jpg


尚未有邦友留言

立即登入留言