资讯专栏INFORMATION COLUMN

javascript-错误与异常、 this关键字

zhaofeihao / 2737人阅读

摘要:错误与异常错误,指程序中的非正常运行状态,在其他编程语言中称为异常或,错误。定义一个全局变量,并赋值对象的方法绑定在中,构造函数只是一些使用操作符时被调用的函数。包括内置对象函数在内的所有函数都可以用来调用,这种函数调用被称为构造函数调用。

错误与异常

错误,指程序中的非正常运行状态,在其他编程语言中称为‘异常’或,‘错误’。解释器为每个错误情形创建并抛出一个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种预定义错误类型

抛出语句

与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    

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96936.html

相关文章

  • JavaScript】面向对象之错误异常this键字

    摘要:一错误与异常概述错误,指程序中的非正常运行状态,在其它语言中称为异常或错误将每个错误中创建个对象,描述包含的错误信息通过使用提供异常的处理语句,可以用结构化方式捕捉发生错误,异常处理代码与核心代码实现分离语句语句是指中处理异常一种标准方式, JS(JavaScript)一.错误与异常1.概述错误,指程序中的非正常运行状态,在其它语言中称为异常或错误将每个错误中创建个Error对象,描述...

    ASCH 评论0 收藏0
  • JavaScripr中常遇到的错误this键字

    摘要:通过使用提供的异常处理语句,可以用结构化的方式来捕捉发生的错误,让异常处理带啊与核心业务代码实现分离。错误与异常处理在应用中的重要性是毋庸置疑的。包括内置对象函数在内的所有函数都可以用来调用,这种函数调用被称为构造函数调用。 错误与异常 概念 错误与异常是什么错误,指程序中的费正常运行状态,在其他编程语言中称为‘异常’或‘错误’。解释器会为每一个错误创建并抛出一个Error对象,其中包...

    klinson 评论0 收藏0
  • JavaScript 编程精解 中文第三版 八、Bug 和错误

    摘要:幸运的是,使用符号创建的构造器,如果在不使用来调用,则始终会报错,即使在非严格模式下也不会产生问题。 来源:ApacheCN『JavaScript 编程精解 中文第三版』翻译项目原文:Bugs and Errors 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 调试的难度是开始编写代码的两倍。 因此,如...

    wujl596 评论0 收藏0
  • JavaScript 进阶知识 - 高级篇

    摘要:汪汪汪哈士奇大黄狗输出结果为这样写依然存在问题全局变量增多,会增加引入框架命名冲突的风险代码结构混乱,会变得难以维护想要解决上面的问题就需要用到构造函数的原型概念 showImg(https://segmentfault.com/img/remote/1460000017534338?w=1440&h=900); JS高级 前言 经过前面几篇文章的学习,相信大家已经对js有了大部分的理...

    LiuRhoRamen 评论0 收藏0
  • 严格模式的简单认识

    摘要:不支持严格模式的浏览器与严格模式的浏览器行为也不一样,所以不要在未经严格模式特性测试情况下使用严格模式。在严格模式下,使用上述标识符作为变量名会导致语法错误。严格模式下,命名参数与对象是完全独立的。在严格模式下,函数的值始终是指定的值。 严格模式 概述 严格模式是什么 严格模式是JavaScript中的一种限制性更强的变种模式。严格模式不是一个子集:它的语义上与正常代码有着明显的差异。...

    learning 评论0 收藏0

发表评论

0条评论

zhaofeihao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<