JavaScripr中常碰到的毛病和this关键字

毛病与非常

观点

毛病与非常是什么
毛病,指顺序中的费一般运转状况,在其他编程语言中称为‘非常’或‘毛病’。诠释器会为每个毛病建立并抛出一个Error对象,个中包含毛病额形貌信息。
经由历程运用JavaScript供应的非常处置惩罚语句,能够用结构化的体式格局来捕捉发作的毛病,让非常处置惩罚带啊与中心营业代码完成星散。
毛病与非常处置惩罚在运用中的主要性是毋庸置疑的。任何有影响力的Web运用都须要一套完美的毛病处置惩罚机制。

try…catch语句

try…catch语句作为JavaScript中处置惩罚非常的一种规范体式格局。try语句标记一块待尝试的语句,假如该语句涌现毛病,则经由历程catch语句举行捕捉。

try {
    console.log(v);//挪用变量,但没有定义--报错!
} catch(e){
        console.log(e);//示意try语句中涌现毛病的信息
       // e--全拼error示意语句中涌现毛病的信息
}

捕捉块

能够运用捕捉块来处置惩罚一切能够正在try代码块中发生的非常。

catch(catchID) {
    console.log();
}

捕捉块指定了一个标识符(上述语句中的catchID)来寄存抛出语句指定的值。
能够用这个标识符来猎取抛出的非常信息。

闭幕快

闭幕快包含了哎try和catch快完成后、下面的语句会接着实行之前的语句。闭幕快不管是不是抛出非常都邑实行。假如抛出了一个非常,就算没有非常处置惩罚,闭幕快的语句也会实行。

try {
    console.log(v);
} catch(error){
    console.log(error)
}
finally{
    接着实行的语句
}

嵌套try…catch语句

能够嵌套一个或多个try…catch语句。假如一个内部的try…catch语句没有捕捉块,将会启动婚配外部的try…catch语句的捕捉快。

try {
    console.log(v);
} catch(error){
    try {
        console.log(a);
    } catch(error){
        console.log(error);
    }
}
finally{
    
}

毛病范例

基础毛病范例
实行低吗时期能够会发作的毛病有多中范例,每种毛病都有对应的出毛病范例。当毛病发作时,就会抛出对应范例的毛病对象。
Error是基础毛病范例,其他毛病范例都继续自该范例。Error范例打的毛病很少见,假如有也是浏览器抛出的。这个基础毛病范例的主要目标是供应给开辟人员抛出自定义毛病的。

this关键字

观点

this是什么

this关键字是JavaScript中最庞杂的机制之一。他是一个很迥殊的关键字,被自动定义在一切函数的作用域中,然则纵然黑白常有履历JavaScript开辟者也很难说清它究竟指向什么。
现实上,JavaScript中this的机制并没有那末先进,然则开辟者每每会把明白历程庞杂化。绝不夸大的说,不明白他的寄义,大部分开辟都没法完成。
this都有一个共同点,它老是返回一个对象。简朴来讲,this就是属性或要领‘当前’地点的对象。

//定义一个全局变量
var v = 100;
function fn(){
//this常常被定义在函数的作用域中
//this老是要返回一个对象
    console.log(this.v);//this指向哪一个对象,不取决于函数定义的位置,而是取决于挪用的位置
}
fn();//函数挪用

为何运用this

this供应了一种更文雅的体式格局隐式‘通报’一个对象援用,因而能够将API设想的越发简约而且易于复用。
跟着运用形式愈来愈庞杂,显现通报上下文对象会让代码变得愈来愈杂沓,运用this则不会如许。

挪用位置

想要相识this的绑定历程,首先要明白挪用位置,挪用位置就是函数在代码中被挪用的位置(而不是声明的位置)。
一般来讲,寻觅挪用位置就是寻觅‘函数被挪用的位置’。最主要的是要剖析挪用栈(就是为了抵达当前实行位置所挪用的一切函数)。

绑定划定规矩

默许绑定

在一个函数中运用this,当该函数被自力挪用。能够把这条划定规矩看作没法运用其他划定规矩时的默许划定规矩。

var a = 100;//定义一个全局变量
function foo(){
    console.log(this.a);
    }
foo();//挪用

隐式绑定

隐式绑定的划定规矩须要斟酌的是挪用位置是不是有上下文对象,或许说是不是被某个对象具有或许包含。固然,这类说法并不准确。
挪用位置会运用obj上下文来援用函数,因而能够说函数被挪用是obj对象‘具有’或‘包含’它。

//定义一个对象
var obj = {
    v :200,
    f:fn  //对象的f()要领指向fn()函数
}
//定义一个全局变量,而且赋值为对象obj的f()要领
var fun = obj.f;
fun();

隐式绑定是最常见的this绑定题目,指的就是被隐式绑定的函数会丧失绑定对象,也就是说它会运用默许绑定,从而把this绑定到全局对象。
fun是obj.f的一个援用,然则现实上,他援用的是f函数自身,因而此时的fun()现实上是一个不带任何润饰的函数挪用,因而运用了默许绑定。

显现绑定

显现绑定就是明白在挪用时,this所绑定的对象。JavaScript中供应了apply()要领和call()要领完成。这两个要领打的第一个参数吸收的是一个对象,会吧这个对象绑定到this,接着在挪用函数时指定这个this。

//定义一个全局变量
var a = 100;
//定义一个函数
function fn(){
    console.log(this.a);
}
//定义一个对象
var obj = {
    v:200,
    f:fn   //对象的f()要领指向fn()函数
}
//定义一个全局对象
var fun = obj.f;
//将fun作为函数举行挪用
fun.apply(obj);

new绑定

在JavaScript中,组织函数只是一些运用new操纵符是被挪用的函数。包含内置对象函数在内的一切函数都能够用new来挪用,这类函数挪用被称为组织函数挪用。
运用new来挪用函数胡,会自动实行下面的操纵:
1.建立(或许说组织)一个全新的对象。
2.这个新对象会绑定到函数挪用的this.
3.假如函数没有返回其他对象,那末new表达式中的函数挪用会自动回这个对象。

function Hero(name){
    this.name = name;
}
//this取决于函数挪用的位置
var hero1 = new Hero('张三');
var hero2 = new Hero('李四');

绑定破例

被疏忽的this

假如把null或许undefined作为this的绑定对象传入call、apply或许bingd,这些值在挪用时会被疏忽,现实运用的是默许绑定划定规矩。

function fn(){
    console.log(this.v);
}
var v = 200;
fn.call(null);

var result = Math.max.apply(null,[1,2,3,4,5,2,3,]);
console.log(result);

间接援用

有能够(故意或许无意地)建立一个函数的“间接援用”,在这类情况下,挪用这个函数会运用默许绑定划定规矩。

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

注意事项

防止多层this

多层函数或要领嵌套能够致使差别条理this绑定的对象差别。

var o = {
    f1:function() {
        console.log(this);
        var f2 = function(){
            console.log(this);
        }();
    }
}
o.f1();

上述代码包含两层this,效果运转后,第一层指向对象o,第二层指向全局对象。

防止数组要领中this

数组的map和foreach要领,许可供应一个函数作为参数。这个函数内部不应该运用this。

var obj = {
    v:100
    arr:[1,2,3,4],
    f:function(){
        this.arr.forEach(function(value){
            console.log(this.v);
        })
    }
}
obj.f();

防止回调函数中的this

回调函数中的this常常会转变绑定的对象,最好的解决方案就是防止如许运用this。

var o = {
    name:'张三'
}
o.fn = function(){
    console.log(this.name);
}
var name = '李四';
function f(v){
    v();
}
f(o.fn);

上述代码中,f()要领的回调函数中this,实在就是指全局对象。

    原文作者:武文佳
    原文地址: https://segmentfault.com/a/1190000016113354
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞