JavaScript學習之零碎記憶點總結記錄(一)

weixin_33806914發表於2018-10-09

總結記錄

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

相關文章