this指向问题

this指向

1、全局作用域或者普通函数的this指向window,定时器的this也是指向window
2、方法调用时,谁调用this就指向谁

let obj = {
	say: function() {
		console.log("this:", this)
	}
}

obj.say()
// 结果 打印 this: {say: ƒ}

3、构造函数 中的this指向实例对象

function Fn() {
	console.log("Fnthis:", this)
}
let fn = new Fn();
// 结果打印  Fnthis: Fn {}

4、call、bind、apply可以绑定this,从而改变this指向

this绑定方式

1、默认绑定:函数被调用时this默认指向window
2、隐式绑定:调用一个对象里的方法时,this就会隐式绑定到这个对象上
3、硬绑定:使用call、bind和apply进行this的硬绑定
4、构造函数绑定

示例

示例一:

function a() {
    function b() {
        console.log("b中:", this);
        function c() {
            'use strict'
            console.log("c中:", this);
        }
        c();
    }
    b();
}
a();

结果:
在这里插入图片描述
因为b中未明确指定this的指向,所以this指向window,而c中因为是严格模式,严格模式输出的this就是undefined

示例二:

var name = '张三';

        function boss() {
            console.log("姓名:", this.name);
        }

        var developer = {
            name: '李四',
            detail: function() {
                console.log("姓名:", this.name);
            },
            partner: {
                name: '王五',
                detail: function() {
                    console.log("姓名:", this.name);
                }
            },
            boss: boss
        }

        developer.detail();  // 1、打印--姓名:李四  
        developer.partner.detail();  // 2、打印--姓名:王五  
        developer.boss();  // 3、打印---姓名:李四   

解释:打印1,对象方法发生调用时会发生隐式绑定,this指向该对象;打印2,尽管此时调用的时对象里的对象,但依旧符合隐式绑定,指向调用该方法的对象partner;打印3,此时boss属性对应的值是在全局定义的boss方法,只是将这个方法赋值给了developer.boss,依旧不影响隐式绑规则,this依旧指向developer

示例三:

var name = "张三";
function a() {
   var name = "李四";
   console.log("姓名:", this.name);
}

function d(i) {
   return i();
}

var b = {
   name: "王五",
   detail: function() {
       console.log("姓名:", this.name);
   },
   say: function() {
       return function() {
           console.log("姓名:", this.name);
       }
   }
}

var c = b.detail;
b.a = a;
var e = b.say();

a();  // 1、打印-- 姓名:张三  
c();  // 2、打印-- 姓名:张三  
b.a();  // 3、打印-- 姓名:王五,  
d(b.detail);  // 4、打印-- 姓名:张三,
e();  // 5、打印-- 姓名:张三  

结果:
在这里插入图片描述
解释:打印1,全局范围调用函数a,且没有指定this指向,this则指向window, 李四虽然也是var定义,但因为有函数作用域,所以它不属于window;打印2,尽管c = b.detail,但也仅仅是将这个函数赋值给c,最终调用依旧是c和b无关,且是全局调用;打印3,因为是给b添加了一个属性函数,,此时b调用的时候是隐式绑定this指向b;打印4,是将b.detail的值传给d的参数,并全局调用;打印5,依旧是将say方法执行的输出函数赋值给e,依旧是全局调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值