this指向几种情况详解

1.对象的this(指向.前面)

基本的

var a = 0
var obj = {
    a:1,
    fn() {
    console.log(this.a,this,a);
    }
}
obj.fn()//1,obj ,0

2.直接调用的this(指向window,容易混淆:闭包)

有几种情况:
2.1 函数作为参数传给函数

var a  = 1
function fn() {
    console.log(a);
}
function fn1(data) {
    var a = 2
    data() 
}
fn1(fn)//打印1  属于直接调用,可以看见data()前面什么都没有

2.2 对象里的方法作为参数传给其它函数

var a = 0
var obj = {
    a:1,
    fn() {
        console.log(this,this.a);
    }
}

function fn1(data) {
    var a = 2
    data()
}
obj.fn()//obj,1
fn1(obj.fn)//window,0

2.3 对象里的方法赋给其它变量

var a = 0
var obj = {
    a: 1,
    fn() {
        console.log(this, this.a);
    }
}
var fn = obj.fn
fn()//window,0  直接调用 可以看见调用的时候前面什么都没有

2.4 闭包

var a = 0
function fn() {
    var a = 1
    return function () {
        console.log(this,a,this.a);
    }
}
fn()()//window,1 ,0  this还是指向window但是找变量会从定义函数的内部去找


var a  =1 
function fn() {
    var a = 2
    return {
        fn() { console.log(a,this.a);}
    }
}
function fn1(data){
data()
}
fn1(fn().fn)//2,1    注意输出this.a和a的区别,一个是从调用者身上找,一个从定义时的最近作用域找

千万注意:注意是打印this.x 还是直接打印x 如果是直接打印x 那么会从离定义函数的地方最近的作用域去找,如果是打印this.x就看是直接调用还是“.”前面的调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值