你真的懂this指向?
先搞清楚一点,如果this在函数里面,那么它指向的是“函数执行后”的上一级调用对象。
var a="this is a";
function main() {
console.log(this.a)//这里this指向window.
}
main()//这里相当于window.main(),默认window对象了,所以可以省略;
var o={
x:"this is x",
y:"this is y",
say:function(){
console.log(this.x);
}
}
o.say();//这里的this指向的是对象o,因为你调用这个say是通过o.say()执行的,那自然指向就是对象o,这里再次强调一点,this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁,一定要搞清楚这个。
var o={
name:"maomin",
say1:function(){
console.log(this.name);//maomin
}
}
window.o.say1();
// 上面几行代码和之前的代码几乎相似,为什么没有指向window,这就回到了我刚开始说的,this如果在函数内,那么它指向的是该函数执行后的上一级调用对象。
var o={
a:"this is a",
b:{
a:"I am a",
say:function(){
console.log(this.a);//this is a
}
}
}
var f=o.b.say;
f();
// 这里肯定有疑问了?为什么会指向o呢,不是应该指向b吗?这时你应该注意到这里say没有调用执行,而是通过o.b.say赋值给变量f,然后才被执行。这样就指向o了。
function Fn(job){
this.job=job;
}
var i=new Fn("I am Engineer");
console.log(i.job);//I am Engineer
// 这里是一个构造函数,注意的是this指向构造函数new出来的对象。
// 首先new关键字会创建一个空的对象,然后会自动调用一个函数的一个方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
function Fn1(age){
this.age=age;
return {};
}
var ii=new Fn1("I am 21");
console.log(ii.age);//undefined
function Fn2(love){
this.love=love;
return function(){
}
}
var iii=new Fn1("My grilfriend is xqm");
console.log(iii.love)//undefined
function Fn3(like){
this.like=like;
return 1;
}
var iiii=new Fn3("I like playing CF")
console.log(iiii.like)//I like playing CF
// 当return一个对象时,打印出undefined。其他情况指向函数的实例。
针对上面一大堆的代码和解释是不是对this指向有点头疼呢,当然上面的都是在函数体内的,还有其他情况的this指向这里没说。
下面只是简单的列举
规律1 函数圆括号直接调用 函数上下文为window
规律2 函数作为对象的方法打点调用 函数上下文就是这个对象
规律3 函数作为事件的处理函数 函数上下文就是出发这个事件的对象
规律4 定时器调用函数 函数上下文为window
规律5 数组存放的函数 被数组索引调用 this就是这个数组
其实这五个规律前四个都涉及过,就是第五个没有接触过
function fun() {
console.log(this)
}
var arr=[fun,"a","a"];
arr[0]();
其实仔细总结,如果this在函数里面,那么它指向的是“函数执行后”的上一级调用对象一直适用。
作者:Vam的金豆之路
主要领域:前端开发
我的微信:maomin9761
微信公众号:前端历劫之路