在 JavaScript 遇到錯誤記得修正,不然後方的程式碼都不會運行,這時也可以運用 LHS, RHS 提示來進行排除。
// 出處:六角學院 ↑
var ming = '小明';
ming
上稱為 LHS。var ming = '小明';
var man = ming;
ming
就是使用 RHS 取得這個變數,並且透過 LHS 賦予到左邊的變數。=
的右邊或是函式取得變數上,都可以稱為 RHS。1 = true;
console.log(a);
解析:
Uncaught SyntaxError: Invalid left-hand side in assignment
。
答案:
1 = true;
在編譯時產生錯誤 Uncaught SyntaxError: Invalid left-hand side in assignment
→ LHS 錯誤。
console.log(a);
不會在編譯過程產生錯誤,會在執行階段發現變數無法取得而產生錯誤訊息 Uncaught ReferenceError: a is not defined
,表示此變數是沒有被定義過的,在 JS 運行過程中也無法找到此變數 → RHS 錯誤 。
// 出處:六角學院 ↑
// 範例一
function callName() {
var Ming = '小明';
console.log(Ming);
}
callName(); // 可印出小明
// 範例二
function callName() {
var Ming = '小明';
}
callName();
console.log(Ming); //是無法呼叫到小明,is not desined
// 因JS作用域在函式內,在內層宣告變數外層是讀不到的
// 也就是函式內的程式碼只在{}中運行,出了{}就被釋放掉了。
// 出處:六角學院 ↑
ReferenceError: xxx is not defined
。var value = 1;
function fn1(){
console.log(value);
}
function fn2(){
var value =2;
fn1();
}
fn2();
執行順序 :
fn2()
,再把 value
重新宣告等於 2,再執行 fn1()
。fn1()
內 value
值會等於 1。解說 :
var value = 1;
作用域包含全部,所以無論在 fn1()
或 fn2()
都可以讀取到。fn2()
重新賦予 value = 2
的值,但 value = 2
的值作用域只在 fn2()
內。fn1()
時, fn1()
內的 console.log(value);
就會向外查找 value
等於 1 的值。▶️ 所以答案會印出 1。
// 出處:六角學院 ↑
// 範例
function callName() {
...
}
callName();
callName();
」,它是不會有任何變數產生。**所以是需要執行它「 呼叫 callName();
」才會產生執行環境,這個執行環境內才會有屬於它的變數。callName();
」是可以重複調用的。this
,後方會介紹到。
// 出處:六角學院 ↑
this
,等於 window 或 global。
this
會隨著它的執行環境而有所不同,後方章節會介紹到。// 範例
function sayHi(name) {
// ...
}
function doSomething() {
sayHi();
}
doSomething();
運行順序 :
doSomething()
。doSomething()
裡面再運行 sayHi();
。解說 :
doSomething()
,出現 doSomething()
的執行環境,並且堆疊在全域的執行環境上。doSomething()
內去呼叫 sayHi();
這個函式,sayHi();
會堆疊在 doSomething()
這個函式上。sayHi();
執行完就會先離開 → doSomething()
完成後也會離開 → 最後回到全域的執行環境。var value = 1;
function fn1(){
console.log(value);
}
function fn2(){
var value =2;
fn1();
}
fn2();
fn2();
的執行環境 → 執行 fn2()
內的 fn1();
,雖然在 fn2()
重新賦予 value = 2
的值,但 value = 2
的值作用域只在 fn2()
內。fn1()
時, fn1()
內的 console.log(value);
就會向外查找 value
等於 1 的值。fn1
在往外層尋找 value
時並不會跟執行環境有任何的關聯性。**因為 JS 是語法作用域,它在程式碼撰寫時就已經確定它的作用域。
fn1
沒有 value
這個變數時會向外層全域來做尋找,這尋找過程與執行環境 ( 執行環境也就是 function fn1(){}
內 ) 是沒有關聯性的。var person = '老媽';
function sayHi() {
console.log(`hi ${person}`);
}
function doMorningWork() {
var person = '老爸';
function meetAuntie() {
var person = '漂亮阿姨';
console.log(`嗨囉~ ${person}`);
}
sayHi();
meetAuntie();
}
sayHi();
doMorningWork();
答案
hi 老媽、hi 老媽、哈囉~漂亮阿姨
doMorningWork()
內的 sayHi();
會忽視裏面的變數 person 老爸,向外層尋找變數 value 老媽。因為變數 person 老爸作用域只在 doMorningWork()
內。doMorningWork()
內宣告一個 meetAuntie()
,所以現在執行的不是外層的 sayHi 而是內層的 meetAuntie()
,而內層的 meetAuntie()
本身就有一個 person 變數漂亮阿姨,所以會印出 哈囉~漂亮阿姨
。
var person = '漂亮阿姨';
就會向外尋找變數印出 哈囉~老爸
。