你是否是和我同样,以为this是个难以捉摸的神秘玩意儿,一会指向这个,一会又指向那个,可谓神秘莫测。这篇文章是我在学习过程当中对this的一些总结,或许能拨开一些笼罩在this上的重重谜团……javascript
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
上一部分,咱们已经知道了js用来指定某一个对象或者实体等,看起来好像很简单,实则难的一逼,难就难在this的身份老是难以捉摸的。下面搞几个例子:函数
var a=1;
console.log(this.a);
console.log(this);
复制代码
输出结果:学习
全局变量a是挂在全局window上的,此时的this是window,ui
console.log(this.a);
至关于console.log(window.a);
this
function f(){
console.log(this);
}
f();
复制代码
输出结果:spa
由于f()为全局函数,下面调用f()至关于window调用了f(),此时的this是window。3d
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就是谁。
function One(){
console.log(this)
}
One();
let a=new One();
复制代码
输出结果:
若是在调用函数以前加一个new的话,会建立并返回一个新的对象,这个函数内部的this就会指向这个对象。
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身份之谜的真相也经过实验例子慢慢浮出水面,不过本文也就只是抛砖引玉,皮毛而已,但愿能有所帮助。