天天看點

JS-try...catch 、es5嚴格模式try…catches5嚴格模式

try…catch

try{
    console.log('a');//執行
    console.log(b);//出錯
    console.log('c');//不執行
} catch(e) {
    try中的代碼沒報錯,catch不會被執行
    try中的代碼報錯,會停止執行,跳轉到catch裡執行
    把錯誤資訊封裝到error對象(error.message error.name)裡,把error對象傳到 e 裡面以供使用
}
console.log('d');//執行

// out: a
//      d
           

finally{}

防止報錯

在try裡面的語句發生錯誤,不會執行錯誤後的try裡面的代碼

Error.name的六種值對應的資訊:

  1. EvalError: eval()的使用與定義不一緻
  2. RangeError: 數值越界
  3. ReferenceError:非法或不能識别的引用數值(未經聲明就使用
  4. SyntaxError: 發生文法解析錯誤
  5. TypeError: 操作數類型錯誤
  6. URIError: URI處理函數使用不當(位址

es5嚴格模式

浏覽器基于es3.0 + es5.0的新增方法 使用的

兩者産生沖突時,使用es3.0的方法

當啟用es5.0嚴格模式,那麼es3.0和es5.0産生沖突的部分就是用es5.0,否則會用es3.0

es5.0嚴格模式的啟動:

在整個頁面最頂端寫

"use strict";

(字元串,邏輯最頂端,也可寫到函數的最頂端

不再相容es3的一些不規則文法。使用全新的es5規範。

兩種用法:

全局嚴格模式

局部函數内嚴格模式(推薦)

就是一行字元串,不會對不相容嚴格模式的浏覽器産生影響。(表達式,識别不了不會報錯

  1. 不支援

    with

    arguments.callee

    ,

    func.caller

    ,
  2. 變量指派前必須聲明,(未設定時未聲明的變量為暗示全局變量
  3. 局部this必須被指派(Person.call(null/undefined)指派什麼就是什麼),
  4. 拒絕重複屬性和參數(不報錯

with

with可以改變作用域鍊,使作用域鍊的最頂端變成括号内的對象

var obj = {
    name : 'obj'
}

var name = 'window';

function test () {
    var age = 123;
    var name = 'scope';
    with(obj) {
        console.log(name);
        console.log(age);
    }
}
test();
// out: obj
//      123
           

會把括号裡的對象當作with圈定的代碼體的作用域鍊的最頂端(先在括号裡的對象中找),改變作用域鍊

可以簡化代碼

匿名空間

var org = {
    dp1 : {
        jc : {
            name : 'abc',
            age : 123
        },
        deng : {
            name : 'deng1',
            age : 234
        }
    },
    dp2 : {

    }
}

with(org.dp1.jc) {
    console.log(name);
}
with(org.dp1.deng) {
    console.log(name);
}
           

應用:

用一個名字很長的函數時,可以用with,将.前面的部分放到括号裡

with(document) {
    write('a');
}
           

缺點:

大量的修改作用域鍊,系統核心會消耗大量效率,程式會變得非常慢

局部的this預編譯時為空(undefined,必須被指派

'use strict';

function test() {
    console.log(this);
}
new test();

// out : test{}

為什麼?
test代表 該對象的custructe名(構造器的名
P33 45min聽不懂😖
           

4.拒絕重複屬性和參數

es3.0裡寫重複的參數不報錯

function test(name, name) {
    console.log(name);
}
test(1, 2);
// out: 2
           

重複屬性名 不報錯(可能未來會報錯

var obj = {
    name : 'abc',
    name : '123'
}
           

eval()

可以把字元串當代碼使用

var a = '123';
eval('console.log(a)');
// out : 123
           

es3.0 都不可以使用 eval(); eval 是 魔鬼

可以改變作用域

var global = 100;
function test() {
    global = 200;
    eval('console.log(global)');
}
test();
           

不說了,知道就行

繼續閱讀