一.错误信息
(1).SyntaxError
//变量命名不规范
var 1 = 1;
var 1ab = 1;
//关键字赋值
new = 5;
function = 1;
//基本语法错误
var a = 5:
(2).ReferenceError
//变量或者函数未被声明
test();
console.log(a);
//给无法被赋值的对象赋值的时候
var a = 1 = 2;
var a = 1;
console.log(a) = 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));
(4).TypeError
//调用不存在的方法
123(); //此处Js引擎会判断出123根本就不会是一个函数
//数组长度赋值为负数
var arr = [1,2,3];
arr.length = -1;
console.log(arr);
//对象方法参数超出可行范围
var num = new Number(66.66);
console.log(num.toFixed(-1));var obj ={}
obj.say();//这里为对象的属性调用后加了个执行函数所以不可以
//实例化原始值
var a = new 'string';
var a = new 123;
(5).URI错误
转换编码字符
var myUrl = 'http://www.baidu.cin?name=艾小野';
var newUrl = encodeURI(myUrl);//http://www.baidu.cin?name=%E8%89%BE%E5%B0%8F%E9%87%8E
转换为URI
var newNewUrl = decodeURI(newUrl);
console.log(newNewUrl);
URI错误
var str = decodeURI('sdfadf');
(6).EvalError
eval('var a= c; console.log(e);')
(7).自定义错误
var error = new SyntaxError('代码错误了');
var error = new RefernceError('指向错误');//等等错误都可以
var error = new Error();//总的Error
二.trycatch
try{
if(){
throw '这里出错了'
}
}catch(e){
console.log(e);
var errorTip = {
name : '数据传输失败',
errorCode : '10010'
}
}finally{
}//如果try中出错不影响catch和finally和外部的代码执行
三.严格模式
(1).历史
- 97年 1.0
- 98年 2.0
- 99年 3.0 Js通行标准
- 07年 4.0草案 mozilla支持 因为Branden Eich(Js作者在这家公司)
- 08年 4.0终止 将容易改善的变为3.1 直接叫做ECMA5 困难的为Harmony
- 09年 5.0发布 Harmony 1/2 Js.NEXT 1/2 js.next.next
- 11年 5.1 ISO 国际标准
- 13年 ES6=JS.next js.next.next =7 草案发布
- 15年 ES6正式发布 ECMAScript2015
(2).环境支持
(3).示例代码
'use strict'//全局严格
function test(){
'use strict';//局部严格
}
var test =(function(){
'use strict'//局部严格
})();
(4).多人开发方式
最早的多人开发方式 use strict后with无法使用,(with是可以改变作用域的)
var namespace = {
header : {
Jenny : {
a : 1,
b : 2
}
}
}
with(namespace.header.Jenny){
console.log(a);//1
}
组件化
var initxxx= (function(){
})();
现在的方式
webpack
(5).严格模式下的要求
function test(){
console.log(this);
}
test.call(1);
非严格输出的就是包装类Number了 不赋值的话指向的则为window
function test(a, a){
console.log(a);
}
test(1, 2);
var obj = {
a : 1,
a : 2
}
console(obj.a)
eval('var a =1; console.log(a)');
console.log(a);//报错的
严格模式eval是有自己的作用域的,非严格模式是不报错的能输出出来
四.垃圾回收原理
(1).定义
(2).闭包解除引用
function test1(){
var a = 1;
return function(){
a++;
console.log(a);
}
}
var test =test1();
test();
test();
test = null;//闭包解除引用
test();
(3).标记清除(mark and sweep)
标记清除则为除去全局变量和挂载的AO以外有离开环境标记的清除
function test(){
var a =0; //进入环境
}
test();//a 离开环境
(4).引用计数(reference counting)
function test(){
var a =new Object(); //a=1
var b =new Object(); //b=1
var c=a; //a++ =2
var c=b; //a-- =1 b++ =2
//循环引用
a.prop=b; b=2;
b.prop=a; a=2;
//卸载掉
a= null;
b=null;
}