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的六種值對應的資訊:
- EvalError: eval()的使用與定義不一緻
- RangeError: 數值越界
- ReferenceError:非法或不能識别的引用數值(未經聲明就使用
- SyntaxError: 發生文法解析錯誤
- TypeError: 操作數類型錯誤
- 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規範。
兩種用法:
全局嚴格模式
局部函數内嚴格模式(推薦)
就是一行字元串,不會對不相容嚴格模式的浏覽器産生影響。(表達式,識别不了不會報錯
- 不支援
,with
,arguments.callee
,func.caller
- 變量指派前必須聲明,(未設定時未聲明的變量為暗示全局變量
- 局部this必須被指派(Person.call(null/undefined)指派什麼就是什麼),
- 拒絕重複屬性和參數(不報錯
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();
不說了,知道就行