()=>{}箭头函数this

1.箭头函数是没有绑定this,到上层作用域找this

  • 参数()
  • 箭头=》
  • 函数执行体{}

var obj = {
    data: [],
    getData: function () {
      // setTimeout(function (){
      //   //this 指向window
      //   this.data=[1,2,3]
      //         console.log(this)
      //       }, 1000);
      setTimeout(()=> {
  //箭头函数没有绑定this,只能向上级作用域this
  this.data=[1,2,3]
        console.log(this)
      }, 1000);
    }
  
  }
  obj.getData()

 3.this指向 1.this指向 

 var name = 'window'
    var person = {
      name: 'person',
      sayName: function () {
        console.log(this.name)
      },
    }
    function sayName() {
      var sss = person.sayName
      sss()
      person.sayName()
      person.sayName()
      ;(b = person.sayName)()
    }
    sayName()

4.this指向 

 var name = 'window'
    var person1 = {
      name: 'person1',
      foo1: function () {
        console.log(this.name)
      },
      foo2: () => console.log(this.name),
      foo3: function () {
        return function () {
          console.log(this.name)
        }
      },
      foo4: function () {
        return () => {
          console.log(this.name)
        }
      },
    }
    var person2 = { name: 'person2' }
    person1.foo1() //隐式绑定person1
    person1.foo1.call(person2) //显示绑定person2
    person1.foo2() //箭头函数没有绑定this,上级作用this是window
    person1.foo2.call(person2) //箭头函数没有绑定this,上级作用this是window
    person1.foo3()() //function () {console.log(this.name)}() 独立行数指向window
    person1.foo3.call(person2)() //function () {console.log(this.name)}() 独立行数指向window
    person1.foo3().call(person2) //person2
    person1.foo4()() //person1.foo4()隐式绑定thsi指向person1,返回箭头函数查找上级作用域是person1
    person1.foo4.call(person2)() //person1.foo4.call(person2)显示绑定改变this的指向成person2返回 箭头函数上层作用域是person2
    person1.foo4().call(person2) //person1.foo4()返回 箭头函数上层作用域是person1
    // 隐式绑定,肯定是person1person1.foo1();
     // person1
     // 隐式绑定和显示绑定的结合,显示绑定生效,所以是person2person1.foo1.call(person2);
     // person2
     // foo2()是一个箭头函数,不适用所有的规则person1.foo2()
     // window
     // foo2依然是箭头函数,不适用于显示绑定的规则person1.foo2.call(person2)
      // window
      // 获取到foo3,但是调用位置是全局作用于下,所以是默认绑定windowperson1.foo3()()
      // window
      // foo3显示绑定到person2中
      // 但是拿到的返回函数依然是在全局下调用,所以依然是windowperson1.foo3.call(person2)()
      // window
      // 拿到foo3返回的函数,通过显示绑定到person2中,所以是person2person1.foo3().call(person2)
      // person2
      // foo4()的函数返回的是一个箭头函数
      // 箭头函数的执行找上层作用域,是person1person1.foo4()()
      // person1
      // foo4()显示绑定到person2中,并且返回一个箭头函数
      // 箭头函数找上层作用域,是person2person1.foo4.call(person2)()
      // person2
      // foo4返回的是箭头函数,箭头函数只看上层作用域person1.foo4().call(person2)
      // person1
       {# person1
      this面题.html:16 person2
      this面题.html:18 window
      this面题.html:18 window
      this面题.html:21 window
      this面题.html:21 window
      this面题.html:21 person2
      this面题.html:26 person1
      this面题.html:26 person2
      this面题.html:26 person1 #}

 3.this指向 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <div id="app"></div>
  </body>

  <script>
    var name = 'window'
    function Person(name) {
      this.name = name
      ;(this.foo1 = function () {
        console.log(this.name)
      }),
        (this.foo2 = () => console.log(this.name)),
        (this.foo3 = function () {
          return function () {
            console.log(this.name)
          }
        }),
        (this.foo4 = function () {
          return () => {
            console.log(this.name)
          }
        })
    }
    var person1 = new Person('person1')
    var person2 = new Person('person2')
    person1.foo1() //person1
    person1.foo1.call(person2) person2
    person1.foo2() //person1
    person1.foo2.call(person2) //person2
    person1.foo3()() //window
    person1.foo3.call(person2)() //window
    person1.foo3().call(person2) //person2
    person1.foo4()() //person1
    person1.foo4.call(person2)() //person2
    person1.foo4().call(person2) //person1
    // 隐式绑定person1.foo1()
    // peron1
    // 显示绑定优先级大于隐式绑定person1.foo1.call(person2)
    // person2
    // foo是一个箭头函数,会找上层作用域中的this,那么就是person1person1.foo2()
    // person1
    // foo是一个箭头函数,使用call调用不会影响this的绑定,和上面一样向上层查找person1.foo2.call(person2)
    // person1
    // 调用位置是全局直接调用,所以依然是window(默认绑定)person1.foo3()()
    // window
    // 最终还是拿到了foo3返回的函数,在全局直接调用(默认绑定)person1.foo3.call(person2)()
    // window
    // 拿到foo3返回的函数后,通过call绑定到person2中进行了调用person1.foo3().call(person2)
    // person2// foo4返回了箭头函数,和自身绑定没有关系,上层找到person1person1.foo4()()
    // person1// foo4调用时绑定了person2,返回的函数是箭头函数,调用时,找到了上层绑定的person2person1.foo4.call(person2)()
    // person2
    // foo4调用返回的箭头函数,和call调用没有关系,找到上层的person1person1.foo4().call(person2)
    // person1
  </script>
</html>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
  </head>
  <body>
    <div id="app"></div>
  </body>

  <script>
    var name = 'window'
    function Person(name) {
      this.name = name
      this.obj = {
        name: 'obj',
        foo1: function () {
          return function () {
            console.log(this.name)
          }
        },
        foo2: function () {
          return () => {
            console.log(this.name)
          }
        },
      }
    }
    var person1 = new Person('person1')
    var person2 = new Person('person2')
    person1.obj.foo1()() //window
    person1.obj.foo1.call(person2)() //window
    person1.obj.foo1().call(person2) //person2
    person1.obj.foo2()() //obj
    person1.obj.foo2.call(person2)() //person2
    person1.obj.foo2().call(person2) //obj
    // obj.foo1()返回一个函数
    // 这个函数在全局作用于下直接执行(默认绑定)person1.obj.foo1()()
    // window// 最终还是拿到一个返回的函数(虽然多了一步call的绑定)
    // 这个函数在全局作用于下直接执行(默认绑定)person1.obj.foo1.call(person2)()
    // windowperson1.obj.foo1().call(person2)
    // person2// 拿到foo2()的返回值,是一个箭头函数
    // 箭头函数在执行时找上层作用域下的this,就是objperson1.obj.foo2()()
    // obj
    // foo2()的返回值,依然是箭头函数,但是在执行foo2时绑定了person2
    // 箭头函数在执行时找上层作用域下的this,找到的是person2person1.obj.foo2.call(person2)()
    // person2
    // foo2()的返回值,依然是箭头函数
    // 箭头函数通过call调用是不会绑定this,所以找上层作用域下的this是objperson1.obj.foo2().call(person2)
    // obj
  </script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叮咚前端

你的鼓励是我们的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值