總結記錄
try-catch-finally
常見的五種型別報錯
- SyntaxError語法解析錯誤
- ReferenceError變數未定義
- TypeError變數型別錯誤
- RangeError陣列越界
- URIErrorURI相關函式引數錯誤
try-catch能防止報錯導致後面程式碼不能執行問題
try {
a //a的未定義不影響後面函式的執行
} catch (e) {
console.log(e);
}
(function f() {})()
注意點
-
在報錯前return,不執行catch裡的內容,不報錯也不執行
function f() { try { return "123"; a; } catch(e) { console.log(e); } } console.log(f()); //123
function f() { try { var a; } catch(e) { console.log(e); } } console.log(f()); //undefined
-
return在報錯後,return的內容不會被執行,執行完catch結束,如果有finally語句就再執行finally然後結束
function f() { try { a; return 123; } catch(e) { console.log(e); } finally { console.log("執行finally"); } } console.log(f()); //ReferenceError 執行finally undefined //之所以是undefined不是123是因為先報錯執行catch了
-
finally不管是否報錯以及是否return,都會執行,
對於try中在沒有報錯下return的內容會先儲存不輸出,先進行finally內容執行var count = 0; function f() { try { return count; } catch(e) { console.log(e); } finally { count ++; console.log(count); } } console.log(f()); //1 0 說明return count 時count的值先被記錄了只是未返回
總結:先報錯:先執行catch,再finally;遇到return:先保留其值,再在執行finally,最後return結果,return可以覆蓋在finally中遇到return就直接返回結果了
變數提升
只有變數申明和函式申明才會提升
if(0) {function a() {}} 不建議內部申明函式,變數提升時a是undefined
預編譯步驟:
-
建立go物件,所有全域性的申明都被提升,函式申明優先於變數申明(同名時函式覆蓋變數),結果函式預編譯成函式,變數為undefined
//console.log(f); //ƒ f() {} var f; //console.log(o); //undefined var o; function f() {}; //console.log(g) //ReferenceError: g is not defined 這是表示式,不被提升 (function g() {}); //console.log(d) //ReferenceError: d is not defined 這是表示式,不被提升 (function d() {})(); //console.log(y) //undefined y是變數申明 當然t也是報錯,t is not defined var y = function t() {}; //console.log(c) //ReferenceError: c is not defined 這是表示式,不被提升 c = 1; //console.log(h) //ReferenceError: h is not defined 這是表示式,不被提升 console.log(k); //undefined if (function h() {}) { var k; }
-
函式執行時建立ao物件
- 建立this以及arguments物件
- 找形參和變數申明 ,將變數和形參名作為ao物件屬性名,值為undefined
- 將實參值和形參統一
-
找函式宣告,將函式名作為ao物件的屬性名值為函式體
a = 100; function d(e) { function e() {}; arguments[0] = 2; console.log(e); //2 console.log(c); //un console.log(b); //un if(1) { var b = 123; function c () { } } var c; a = 10; var a; console.log(b); //123 f = 123; console.log(c); //function c() {} console.log(a); //10 } var a; d(1); console.log(a); //100 console.log(f); //123