JavaScript - this脱坑指南

首先this是什么?
this就是对象
请看案例:

//nodejs环境中
console.log(this);  //返回{}
//浏览器环境
console.log(this);  //返回windows对象

作用:动态指定当前对象,使用当前对象的方法
那么怎么使用this呢?
js中的对象或者方法具有this作用域
那么this有什么坑呢?
 由于js原先的特性,this的作用域是在执行的时候确定的,这样就会导致this指向不明确
请看坑(所谓的坑就是内层函数不能访问外层的this,一般发生在回调函数的时候):

var name="global";
var test={
    name:"test",
    showName:function(){
        console.log(this.name)
    },
    showArrow:function(){
        setInterval(() => {console.log(this.name)}, 1000);   
    },
    showFun:function(){
        setInterval(function(){console.log(this.name)}, 1000);
    }
}
test.showFun();    //输出undefined
test.showArrow();  //输出test

为什么输出undefined?
 因为匿名函数中没有指定name,所以是undefined
解决方案:
一、使用es6中箭头函数
箭头函数中this:是在定义的时候确定的
实质:
箭头函数中根本没有this,它只会引用外层函数的this,也就是我们为了防止this指向不明确,经常采用的this赋值:
var _self=this;
箭头函数相当于在内部采用了这一个策略,引用外层作用域

var bird={
    name:'bird',
    speak:()=>{
        //console.log(this);
        console.log("I am a "+this.name);
    }
}
var duck={
    name:"duck",
    speak:function(){
        console.log("I am a "+this.name);
    }
}
const type=(animal)=>{
    if(typeof animal.speak == "function"){
        animal.speak();
        return true;
    }
    return false;
}
type(bird);
type(duck);

输出结果为:

I am a undefined
I am a duck

为什么呢?
 因为箭头函数内部没有this,会向上寻找this,speak是一个函数,具有this,但是其this.name没有赋值,所以是undefined。
也就是
      箭头函数寻找,最近的具有this作用域的对象

因为箭头函数内部没有this,我们在箭头函数内部打印出来,

{}

可以看到是一个对象
二、使用bind,显式指定this作用对象

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值