十八、错误信息、try_catch、严格模式、变量的生命周期、垃圾回收原理
一、错误信息
1.1 SynatxError 语法错误
var 1 = 1;
var 1ab = 1;
new = 5;
function = 1;
var a = 5:
function 1test() {}
1.2 RefrenceError引用错误
test();
console.log(a);
var a = 1 = 2;
var a = 1;
console.log(a) = 1;
1.3 RangeError范围错误
var arr = [1, 2, 3];
arr.length = -1;
console.log(arr);
var num = new Number(66.66);
console.log(num.toFixed(-1));
1.4 TypeError类型错误
123();
var obj = {};
obj.say();
var a = new 'string';
1.5 URIError URI错误
URI:UNIFORM RESOURCE IDENTIFIER统一资源标识符
URL:UNIFORM RESOURCE LOCATOR统一资源定位符
URN:UNIFORM RESOURCE NAME统一资源名称
var myUrl = 'http://www.baidu.com?name=你好哈哈';
var newUrl = encodeURI(myUrl);
console.log(newUrl);
var newNewUrl = decodeURI(newUrl);
console.log(newNewUrl);
var str = decodeURI('%fdsdf%');
1.6 EvalError eval函数执行错误
eval('var a = 1; console.log(a)');
var obj = {
a: 1,
b: 2
};
console.log(eval('obj'));
var error = new Error('代码错误了');
console.log(error);
二、try_catch
系统自动抛出错误:
console.log('正常执行1');
console.log(a);
console.log('非正常执行');
手动抛出错误的方法:try catch finally throw
try {
console.log('正常执行1');
console.log(a);
console.log(b);
console.log('正常执行2');
} catch (error) {
console.log(error.name + ':' + error.message);
} finally {
console.log('正常执行3');
}
console.log('正常执行4');
var jsonStr = '';
try {
if (jsonStr == '') {
throw 'JSON字符串为空';
}
console.log('我要执行啦!!!!');
var json = JSON.parse(jsonStr);
console.log(json);
} catch (error) {
console.log(error);
var errorTip = {
name: '数据传输失败',
errorCode: '10010'
}
console.log(errorTip);
}
三、ES5严格模式
3.1 定义
'use strict'
书写位置:
3.2 特性
-
严格模式下,不允许使用with语句。 普通模式下with作用:改变内部代码所执行时作用域链的顶部位置。 以下代码中把{}的作用域链最顶端改成window,然后才是函数test的AO。 var a = 5;
function test(){
var a = 10;
var b = 7;
with(window){
console.log(a);
console.log(b);
}
}
test();
-
严格模式下,函数中的this的值为undefined。new 函数this指向实例化对象这个与非严相同。 -
this的赋值必须通过call。 严格模式下,this赋值原始值就原始值,普通模式为包装类对象。
-
严格模式下,arguments.callee,arguments.caller,arguments properties不允许 -
严格模式下,不写var,直接声明a = 1不允许。变量提升没问题。 -
严格模式下,函数参数不能重复——>报错;对象属性不能重复——>规定,但不报错。 -
严格模式下,eval有自己的作用域,不再是全局。
四、变量的生命周期
-
全局变量的生命周期:浏览器页面关闭前一直存在——>无需讨论。 -
局部变量的生命周期:函数执行的过程中存在。特例:闭包! function test1(){
function test2(){
a++;
console.log(a);
}
var a = 1;
return test2;
}
var test3 = test1();
test3();
test3();
test3();
test3();
test3执行结束,test2的AO被释放了,但是原来test1的AO仍然存在,且被test2连着。 这里test2拿到的是test1的AO引用;如何解除引用(闭包的引用): test3 = null;
五、垃圾回收原理
js不需要手动进行垃圾回收——>内存回收。
垃圾回收原理过程:
- 找出不再使用的变量
- 释放其占用的内存
- 固定的时间间隔运行
5.1 垃圾回收策略
5.1.1 ※标记清除:mark and sweep
给变量添加一个标记。
function test(){
var a = 0;
}
test();
特性:
- 周期性
- 排除全局变量、排除闭包不释放AO中的变量;
- 再看到有离开环境的标记,就把这个变量清除掉,回收它们所占内存空间。
注:不同浏览器,标记的形式不同;垃圾回收的机制不同。策略一样:标记清除。
5.1.2 引用计数:reference counting(了解)
记录每个引用值次数,为0清理。
function test(){
var a = new Object();
var b = new Object();
var c = a;
var c = b;
a = null;
b = null;
}
|