探秘js中的this

你是否是和我同样,以为this是个难以捉摸的神秘玩意儿,一会指向这个,一会又指向那个,可谓神秘莫测。这篇文章是我在学习过程当中对this的一些总结,或许能拨开一些笼罩在this上的重重谜团……javascript

什么是this

this是js中的关键字之一,它也是不少语言的关键字,用于指定某一个对象。java

this, self, and Me are keywords used in some computer programming languages to refer to the object, class, or other entity of which the currently running code is a part. --《维基百科》app

this的谜之身份

上一部分,咱们已经知道了js用来指定某一个对象或者实体等,看起来好像很简单,实则难的一逼,难就难在this的身份老是难以捉摸的。下面搞几个例子:函数

状况1:全局

var a=1;
    console.log(this.a);
    console.log(this);
复制代码

输出结果:学习

全局变量a是挂在全局window上的,此时的this是windowui

console.log(this.a);至关于console.log(window.a);this

状况2:全局函数

function f(){
        console.log(this);
    }
    f();
复制代码

输出结果:spa

由于f()为全局函数,下面调用f()至关于window调用了f(),此时的this是window3d

状况3:对象的方法

var a=1;
    let obj = {
        a:2,
        say:function(){
            console.log(this.a)
        }
    }
    obj.say();
    let f=obj.say;
    f();
复制代码

输出结果:code

这个结果能够说明,当用obj.say()调用函数时,this是obj当用f()调用函数时,this是window

到这里就能够得出一个重要结论:谁调用了包含this的函数,this就是谁

状况4:new

function One(){
        console.log(this)
    }
    One();
    let a=new One();
复制代码

输出结果:

若是在调用函数以前加一个new的话,会建立并返回一个新的对象,这个函数内部的this就会指向这个对象

状况5:call和apply

function f(){
        console.log(this);
    }
    let obj={};
    f.call(obj);
复制代码

输出结果:

function f(){
        console.log(this);
    }
    let obj={};
    f.apply(obj);
复制代码

输出

使用call和apply,this指向第一个参数

结束

归根到底,真理就是一句话:

谁调用了,this就是谁

实践是检验真理的惟一标准,再错综复杂的this身份之谜的真相也经过实验例子慢慢浮出水面,不过本文也就只是抛砖引玉,皮毛而已,但愿能有所帮助。

相关文章
相关标签/搜索