ECMAScript-18 【错误信息-trycatch-严格模式-垃圾回收原理】

一.错误信息

(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函数执行错误

eval('var a= c; console.log(e);')

eval可以快速将json字符串转换为json对象

(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).历史

  1. 97年  1.0
  2. 98年   2.0
  3. 99年   3.0 Js通行标准
  4. 07年   4.0草案 mozilla支持 因为Branden Eich(Js作者在这家公司)
  5. 08年   4.0终止 将容易改善的变为3.1 直接叫做ECMA5  困难的为Harmony
  6. 09年   5.0发布 Harmony 1/2 Js.NEXT 1/2 js.next.next
  7. 11年   5.1 ISO 国际标准
  8. 13年   ES6=JS.next js.next.next =7  草案发布
  9. 15年   ES6正式发布 ECMAScript2015

(2).环境支持

  1. IE9及以下IE不支持
  2. 3.0-》严格模式
  3. ’use strict‘

(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).严格模式下的要求

严格模式中calle 不能用  caller也不能

严格模式下必须要var 变量 不var报错

严格模式下函数中的this不指向window

function test(){
    console.log(this);
}
test.call(1);

严格模式下输出的是1

非严格输出的就是包装类Number了 不赋值的话指向的则为window

function test(a, a){
    console.log(a);
}
test(1, 2);

严格模式下函数的参数不能重复

var obj = {
    a : 1,
    a : 2
}
console(obj.a)

严格模式下对象的命名是不允许重复的,但是不报错输出2

eval('var a =1; console.log(a)');
console.log(a);//报错的

严格模式eval是有自己的作用域的,非严格模式是不报错的能输出出来

四.垃圾回收原理

(1).定义

  1. 找出不再使用的变量
  2. 释放其占用内存
  3. 固定的时间间隔运行

(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;
}

你可能感兴趣的:(ECMAScript,javascript,java)