彻底搞懂this

彻底搞懂this

普通函数的this

this的取值 不取决于函数的定义,而是取决于怎么调用的

-全局内调用:【fn()】指向window

-作为对象内的方法调用:【obj.fn()】 指向调用对象

-作为构造函数调用:【const ldh = new Star()】 指向实例对象

-特殊调用(call、apply、bind):【fun.call(obj)】 指向obj

-事件处理函数中调用:指向当前触发事件的DOM元素

-如果找不到所属的调用者:指向window

箭头函数中的this

箭头函数本身没有this,而是沿用上层作用域的this

箭头函数本身没有this,而是沿用上层函数作用域(非箭头函数)或者全局作用域的this

示例:
function foo(){
    console.log(this)
}
foo() => window
foo.call({name:'张三'}) => {name:'张三'}
const obj = {
    foo:function(){
		console.log(this)   
    }
}
obj.foo.call({name:'张三'})  => {name:'张三'}
obj.foo()
const obj2 = {
    foo:function(){
        function bar(){
            console.log(this)
        }
        bar()
    }
}
obj2.foo() 
function Star(name){ 
    this.name = name
}
const ldh = new Star('刘德华')  =>ldh
<div>按钮</div>
document.querySelector('div').addEventListener('click',function(){
    console.log(this) =>div
}) 
 const fn = () =>{
    console.log(this)
 }
 fn.call({name:'张三'})  =>window
 fn() =>window
 document.querySelector('button').addEventListener('click', () => {
       console.log(this)  =>window
 }) 
var name = '小王'
 const user = {
     name: '老王',
     walk: () => {
        console.log(this.name) 
     }
  }
  user.walk()  => '小王'
const user = {
     name: '小明',
     sleep: function () { 
       const fn = () => {
          console.log(this) 
       }
       fn()
     }
  }
  user.sleep() =>user 
  user.sleep.call(Window) =>window
 const user = {
     name: '小明',
     sleep: function () { 
         const bar = () =>{
           const fn = () => {
              console.log(this)
           }
           fn()
         }
         bar()
     }
    }
  user.sleep()  => user
综合案例:

let length = 20;
let obj = {
    length:100,
    sayHi:function(){
        console.log(this.length)
    }
}
obj.sayHi()  => 100
const fn = obj.sayHi
fn() => 0
const arr = [obj.sayHi,2,3] 
const arr = [function(){console.log(this.length)},2,3] 
obj.fn()  === obj['fn']()
arr[0]() => 3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值