浅谈this指向

序言
this何意?翻译为”这个“,可是这个又是哪个呢?可想而知,这需要根据语境不同,”这个“也不会相同,其实在javascript中this也是这样一个特殊的存在,今天就和大家简单聊聊javascript中的"this"指向。
this永远指向函数的“调用者”
首先大家深刻理解下上述这句话,进一步解释这句话就是“”函数内this的取决于函数是如何被调用“”下面是日常使用过程中会分为以下的几种情况:
1.当函数自己调用时此时函数中的this指向全局对象window

function foo(){
conselo.log(this)
}foo()//此时this在非严格模式下指向window,严格模式下指向undefined

2.构造函数中,this指向实例对象

function Top(){
this.name=name
}
var top=new Top();
top={name:tony}
Top();//tony,此时Top中的this指向top

3.当函数是作为一个对象的方法被调用时,this指向该对象

function top(){
coselo.log(this.gae)
}
var show={
age:60}
show.top();//60此时this指向show,调用函数的对象

4.在事件处理函数中,this指向触发事件的DOM对象

var btns_ele=document.getElementById(#btn)
btns_ele.onclick=function(){
console.log(this)
}//<div><button id="btn"></button></div>
//此时this指向的是当前触发事件的每个“button”

5.在箭头函数中,this指向为它的父级的this指向(箭头函数中的this取决于该函数被创建时的作用域环境)

 var x= 10
    var obj ={
      x: 20, 
      f1: function(){
        console.log(this.x)
      },
      f2: () => {
        console.log(this.x) // 指向 window
      }
    }
    obj.f1() // 20
    obj.f2() // 10
    
 var name = "jack"
    var man = {
      name: 'tom',
      f1: function(){
        setTimeout(()=>{
          console.log(this.name) // 'tom' 此时this指向与f1函数中的this指向相同为man
        }, 0)
      },
      f2: function(){}
      f1();

通过上述的总结不难看出,我们探讨的都是函数中的this指向,在javaScript中人们常说“万事万物皆对象”当然函数也是对象,师对象就会有属性与方法,下面来探讨下关于函数中this的方法

我们知道在不同的情景下this的指向是不同的,那我们能不能通过一些方法把他们变成相同的呢!答案是可以的。

改变函数中this指向有三种方法分别为 apply() 、call()、bind(),当然他们彼此也是有些不同,我们一个个探讨。
1.call();

var obj={
    name:"tony",
    sex :};
function show(a, b){
    console.log(this, a, b);//此时this=>window
}
show.call(obj, 1, 2); //此时 this->obj

2.apply()

var obj={
    name:"tony",
    sex :};
function show(a, b){
    console.log(this, a, b);//此时this=>window
}
//函数会立即执行
show.apply(obj,[1,2]; //此时 this->obj

总结:通过例子我们不难看出,上述两者的区别,体现在参数传递方式的不同
call是一个一个传入
apply是传入一个数组,一次性传完。
3.“bind()()”

var obj={
    name:"tony",
    sex :};
function show(a, b){
    console.log(this, a, b);//此时this=>window
}
//此时可以看到使用bind改变this指向,并没有立即执行
show.bind(obj, 1, 2)(); // this->obj

总结
但是bind和call、apply的区别是bind更改this后不会立即执行,它会返回一个新函数。
bind传参也是一个一个的传入。
后话
今天简单和大家分享下,我目前遇到的几部分this指向的情况,研究js的路还很漫长,下周和大家探讨下,js中“面对对象编程的思想”,
感谢阅读,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值