总结记录

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

Infinity
293 声望9 粉丝

学前端中,只想激情优雅的写代码