总结记录
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。