JavaScript執行(四):try裡面放return,finally還會執行嗎?
所有前端體系的集合連結:web之路
介紹JS語句執行機制涉及的一種基本型別:Comletion 型別。
Completion 型別
function foo(){ try{ return 0; } catch(err) { } finally { console.log("a") } } console.log(foo());
這段程式碼,結果告訴我們finally執行了,而且return語句也生效了。雖然return
執行了,但是函式沒有立即返回,又執行了finally裡面的內容
function foo(){ try{ return 0; } catch(err) { } finally { return 1; } } console.log(foo());
這段程式碼,可以看出finally中的return “覆蓋”了try 中的return
這一機制的基礎是JS 語句執行的完成狀態,我們用一個標準型別來表示: Completion Record,用於描述異常、跳出等語句執行過程。
它表示一個語句執行完之後的結果,它有三個欄位:
- [[type]] 表示完成的型別,有 break continue return throw 和 normal 幾種型別
- [[value]] 表示語句的返回值,如果沒有,就是empty
- [[target]] 表示語句的目標,通常是一個JS標籤
先來一張語句的分類圖
image.png
普通的語句
在JS中,我們把不帶控制能力的語句叫普通語句
這類語句在執行時,從前到後順次執行,沒有任何分支或者重複執行邏輯
普通語句執行後,會得到[[type]]為normal 的 Completion Record(以後簡稱CR), JS遇到這個型別的CR,會繼續執行下一條語句。
用Chrome 自帶的調式工具,輸入一個表示式,在控制檯可以得到結果,但是在前面加一個var 就會是undefined
Chrome控制檯顯示的正是語句的CR的[[value]]
語句塊
拿大括號括起來的一組語句,它是語句的複合結構,可以巢狀
return 語句 可能產生 return 或者 throw 型別的 CR。
{ var i = 1; // normal, empty, empty return i; // return, 1, empty i ++; console.log(i) } // return, 1, empty
控制性語句
帶有if、switch關鍵字,分為兩類
- 對其內部造成影響,如if、switch、while/for、try。
- 對外部造成影響,如break、continue、return、throw
我們需要控制語句跟break、continue、return、throw 四種類型與控制語句兩兩組合產生的效果。
image.png
消費指對應的程式碼被有效的執行了,穿透指對應程式碼被跳過了
帶標籤的語句
實際上、任何JS語句都是可以加標籤的,在語句前加冒號即可:
firstStatement: var i = 1;
作用就是:與完成記錄型別中的target 相配合,用於跳出多層迴圈
outer: while(true) { inner: while(true) { break outer; } } console.log("finished")