错误与异常

错误,指程序中的非正常运行状态,在其他编程语言中称为‘异常’或,‘错误’。解释器为每个错误情形创建并抛出一个Error对象,其中包含错误的描述信息。
通过使用JavaScript提供的异常处理语句,可以用结构优化的方式捕捉发生的错误,让异常处理代码核心业务代码实现分离。

try...catch语句

try...catch 语句作为js中处理异常的一种标准方式。try语句标记一块待尝试的语句,如果该语句出现错误,则通过catch语句进行捕捉。

try {
    console.log(v);//- 调用未定义的变量,语法报错
}
//用于处理try中出现的错误
catch (error){
    //error - 表示try中出现错误的信息
    console.log(error);
}
//终结快 - 无论catch语句是否处理了try语句中的错误与异常,都会输出finally语句中的内容
finally {

}

错误类型

基本错误类型

执行代码期间可能会发生的错误类型有多种种类,每种种类都有对应的错误类型。当错误发生时,就会抛出对应类型的错误对象。
Error是基本错误类型,其他错误类型都继承于该类型。Error类型的错误很少见,如果有也是浏览器抛出的,这个基本错误类型主要目的是提供给开发人员抛出自定义错误。

预定义错误类型

js提供了7种预定义错误类型

clipboard.png

抛出语句

与try...catch语句配合使用的还有throw操作符,用于随时抛出定义错误。抛出错误是,必须给throw操作符制定一个值。(值不限类型)

function fn(v) {
    if (v){
        return v;
    }else {
        throw {name : '化物语'};
    }
}
//console.log(fn());
/*
        throw {name : '化物语'};
        ^
[object Object]
*/

var result;
try{
    result=fn();
}catch (e){
    result = 'aa'
    console.log(e.name);//化物语
}
console.log(result);//aa

this关键字

概述

this是什么

this是js中最复杂的机制之一。它是一个很特别的关键字,被自动定义在所有函数的作用域中。
this都有一个共同点,他总是范慧慧一个对象。或者说,this就是属性或方法‘当前’所在的对象。

为什么使用this

this可以使API设计变得更加简洁并且易于复用。

调用位置

想要了解this的绑定过程,首先要理解调用位置:调用位置就是函数在代码中被调用的位置(不是声明的位置)。

var v = 100;

function fun() {
    console.log(this.v);
}
fun();//undefined(全局对象不可用)若全局对象可用为100

var obj ={
    v : 200,
    f : fun   
};
obj.f();//200   当前this指向对象obj

绑定规则

默认绑定

在一个函数中使用this,当该函数被独立调用。可以把这条规则看作是无法应用其他规则时的默认规则。

function fun (){
     console.log(this.v);//当前this指向全局对象
}
//全局变量
var v = 2;
//函数调用
fun();//2  - 全局对象可用

隐式绑定

隐式绑定的规则需要考虑的是调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含。(说法不准确)。

function fun (){
     console.log(this.v);//当前this指向对象obj
}
//定义对象
var obj = {
   v : 23,
   f : fun
}
obj.f();//23

隐式绑定丢失

隐式丢失是最常见的this问题,指的是被隐式绑定的函数会丢失绑定对象,也就是说会应用默认绑定,把this绑定到全局对象上。

function fun(){
    console.log(this.v);
}
var obj {
    v : 23,
    f : fun
}
//定义一个全局变量,并赋值对象obj的f方法
var foo = obj.f
foo();//undefined   - this绑定到了全局对象

显示绑定

显示绑定就是明确在调用时,this绑定的对象。可以使用apply()方法和call()方法实现。
这两个方法的第一个参数就收的是一个对象,会把这个对象绑定带this上,接着在调用函数时制定这个this。

function fun(){
     console.log(this.v);
};
var obj {
     v : 23,
     f : fun
};
//定义一个全局变量,并赋值对象obj的f方法
var foo = obj.f;
foo.call(obj);//23

new绑定

在js中,构造函数只是一些使用new操作符时被调用的函数。包括内置对象函数在内的所有函数都可以用new来调用,这种函数调用被称为构造函数调用。
使用new来调用函数,会执行以下操作

  • 创建一个全新的对象
  • 这个对象会绑定到函数调用的this
  • 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象
function Fun(name){
     this.name = name
};
var fun  = new Fun'花';
console.log(fun.name);//花

实现继承

function fun() {
      this.name = '火锅';
}
//将fun继承于Fu
function Fu(){
      fun.call(this);
      this.age = 2;
}
var fu= new Fu();

console.log(fu.name);//火锅
console.log(fu.age);//2

绑定例外

被忽略的this

如果将bull或者undefined作为this的绑定对象传入call、apply、bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。

function fun (){
    console.log(this.v);
};
var v = 23 
fun.call(null);//23  - 全局对象可用的情况下

间接引用

有可能有意或无意的创建一个函数的‘间接引用’,在这种情况下,调用这个函数会应用默认绑定规则。
间接引用最容易在赋值时发生。

function fun (){
     console.log(this.a)
}
var a = 2;
var o ={
    a : 3,
    foo = fun;
};
var p ={a:4};
o.foo();//3
(p.foo = o.foo)()//2    

李威振
16 声望5 粉丝

别离时方知此世间,花亦花来人亦人