JS中的this指向

目录

一、this关键字      

二、this理解:

三、this案例:

四、构造函数:


一、this关键字      

        (1)在方法中,this表示该方法所属的对象

        (2)若单独使用,this表示全局对象

        (3)在函数中,this表示全局变量

        (4)在事件中,this表示接受事件的元素

二、this理解:

        (1)this是js的一个关键字,指向一个对象,然后替代this;函数中的this指向行为发生的主体,函数外的this指向window

        (2)函数内的this和函数在什么环境下定义的没有关系,意思是和他的作用域没有关系,而是和自己执行时候的主体有关

        (3)主体:看函数调用前面有没有点(.),若有则就是其前面的对象,若没有就指向window

        (4)一般来说,this指向的是哪个最后调用它的对象

        (5)若函数中有this,但他没有被上一级对象所调用,那么this就指向window;若被上一级对象调用,则this就指向上一级对象

三、this案例:

案例一:

var name = 'su';
var person = {
    name:'wan',
    showName:function(){
        console.log(this.name)
    }
}
person.showName();//输出wan 
//person.showName();函数调用:函数名之后有括号就是调用,没有就等同于赋值
//这里是person对象调用showName方法,所以this指针指向的就是person对象(.前面的对象)

var showNameA = person.showName;//没有括号,等于赋值,赋给showNameA变量
//而showNameA变量相当于一个window对象的属性,因此showNameA()执行相当于window.showNameA(),
//即全局变量,所以this指向的是window
showNameA();//输出su

 案例二:

var personA = {
    name:'GaoWX',
    sayNameA:function(){
        console.log(this.name)
    }
}
var personB = {
    name:'SuwanH',
    sayNameB:personA.sayName
//认为将sayNameA的方法赋给sayNameB(person.sayName没有括号,相当于赋值过程
//相当于personB中的personB为sayNameA:function(){console.log(this.name)}
    }
}
personB.sayNameB();//输出SuwanH
//虽然sayNameA是在personA中定义的,但在调用时却是在personB这个对象调用的
//因此this是指向personB的

实例三

var i = 12;
function test(){
    console.log(this.i)
    }
}

var obj = {
    i : 45,
    ss : function(){
        console.log(this.i);
        test()
    }
}
obj.ss();//输出45 12

obj.ss()指向的是obj中的ss方法,因此ss方法中的this指向的是obj对象,而ss方法中调用test()方法,但test方法之前没有指定对象,即默认全局对象,所以test方法中的this指向的是全局中的i

实例四:

var val = 1;
var obj = {
    val:2,
    dbl:function(){
        var val = 45;
        console.log(this.val);//1
        this.val *= 2;
        console.log(val);//45
        console.log(this.val);//2
    }
}
var ss = obj.dbl;//相当于赋值过程
ss();//ss方法前没有. 默认全局变量

因为ss()前面没有点(.) 所以默认是全局变量,因此dbl中的this指向的是全局window对象

实例五:

var name = '222';
var a = {
    name:'111',
    say:function(){
        console.log(this.name);
    }
}
var fun = a.say;
fun();//222
a.say();//111
var b = {
    name:'333',
    say:function(fun){
        fun()
    }
}
b.say(a.say);
b.say = a.say;
b.say();//333

        (1)将a的say赋值给fun,fun前面没有(.),所以默认是全局变量,即指向window,所以调用fun()函数时,this指向的是全局变量的name,即222;

        (2)调用a.say();say方法前面有a对象,所以此时的this指向的是a对象的name,即111

        (3)b.say = a.say,即b中的say函数也是function(){console.log(this.name);},所以调用b.say()函数时,say指向的是b对象,所以此时的this指向的是b对象的name,即333

案例六

var obj = {
    foo:'test',
    fn:function(){
        var mine = this;
        console.log(this.foo);
        console.log(mine.foo);
    }
}
obj.fn();//test test

fn()中的this是指向obj的,所以输出的是test test

四、构造函数:

        (1)构造函数的new关键字可以改变this的指向,将这个this指向new关键字创建的对象实例

        (2)若返回值是一个对象,那么this指向的就是返回的对象,若返回值不是一个对象,那么this还是指向函数的实例

        案例七:

var name = 'su';
function Person(name,age){
    this.name = name;
    this.age = age;
    console.log(this.name);//test
}
Person(name);//su
Person.prototype.getName = function(){
    console.log(this.name);
}
var p1 = new Person('test',18);
p1.getNmae();//test

        (1)Person(name)调用Person函数,且前面无(.),即为全局变量下的,默认是window的,所以输出‘su’

        (2)var p1 = new Person('test',18);使用了new关键字,则this指向的就是创建的实例对象p1,而p1的参数是test,所以this指向的name就是test

        案例八:

function Person(name){
    this.name = name;
}
var personA = person('su');
console.log(personA.name);//undefind
console.log(window.name);//su
var personB = new Person('wan');
console.log(personB.name);//wan

         (1)因为var personA = person('su');没有使用new关键字,方法前面也没有指定的对象,所以默认是window对象调用的,全局变量name为su,因此第一个输出语句personA的name没有定义,输出undefined;第二个输出语句是window调用的,而window调用的name是传入的参数‘su’,输出‘su’

        (2)var personB = new Person('wan');使用了new关键字,所以this指向的是personB,输出'wan'

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值