this

前言

提示:这里可以添加本文要记录的大概内容:

在javaSrcipt中也经常会用到this关键字,但是仅局限于用它,如果要求讲明白this到底是什么的话可能就有点懵逼了。这玩意this是神马东东!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、this是什么?

  1. this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。
  2. this永远指向一个对象
function fn() {
            console.log(this.A);
}
var obj = {
        A: '1',
        F: fn
}
 var A = '2'
 obj.F()  //1
  fn()    //2

在此呢,fn 被调用了俩次,明显俩次结果是不一样的;

二、this的指向

1.在全局环境下的this指向window

console.log(this);       // window

2.被嵌套的函数独立调用时,this指向window

代码如下(示例):

let obj = {
   a: 2,
   say: function () {
  function test() {
console.log(this); // window
 }
 test();
   }
}

obj.say()

3.IIFE自执行函数

代码如下(示例):

+function fn(){
  console.log(this);    //window
  }()

三、this隐式绑定

1.当函数当作方法时候使用,this指向直接对象

function fn() {
   console.log(this);  //say
 }
let obj = {
  fn: fn,
  say: {
        A: 1,
        fn: fn
    }
 }
 obj.say.fn()   //{A: 1, fn: ƒ}

 function fn() {
            console.log(this.name);  //obj
        }
        let obj = {
            name: 'zs',
            say: fn
        }
        let str = obj.say()   //zs
      

四、this隐式丢失

1.被隐式绑定的函数丢失了绑定对象,从而默认绑定到window

 function fn() {
            console.log(this);  //window
        }
        let obj = {
            name: 'zs',
            say: fn
        }
        let str = obj.say   
        str()  //在这执行了方法

2.setTimeout() 和 setInterval() 第一个参数的回调函数中的this 默认指向window

 setTimeout(function () {
        console.log(this);   //window
   }, 0)

五.显示绑定

1.call().apply方法

function fn() {
console.log(this.age)
}
 let info= {
age: 20
}
fn.call(info)//20
fn.apply(info)//20

call和apply,这两个函数的第一个参数,都可以改变执行函数绑定的this,对于call可以跟很多参数,之后的参数单个起都会被传入到要执行函数的参数中,而apply只有俩个参数,第二个参数是一个数组,这个数组是要传入执行函数的参数,

3.bind()

 let obj = {
 name: 'zs'
 }
function foo() {
   console.log(this); // obj
 }
 let fn = foo.bind(obj);
  fn()

4.new绑定

new关键字来执行函数,相当于构造函数来实例化对象,则this指向当前实例化的对象

 function Fn(){
 console.log(this);  //Fn {}
 }
 let A=new Fn()

总结

提示:这里对文章进行总结:

this的优先级:new绑定 > 显示绑定 > 隐式绑定 > 默认绑定 

在js中,一切皆为对象,运行环境也是对象,所以函数都是在某个对象下运行,而this就是函数运行时所在的对象(环境)。这本来并不会让我们糊涂,但是JavaScript支持运行环境动态切换,也就是说,this的指向是动态的,很难事先确定到底指向哪个对象,这才是最让我们感到困惑的地方。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值