美文网首页
JS中this的指向

JS中this的指向

作者: zooeydotmango | 来源:发表于2019-09-25 01:39 被阅读0次

在ES5中this 永远指向最后调用它的那个对象,在箭头函数中this指向定义时所在的对象。

this的本质

JS中三种调用函数的形式:

func(p1, p2) 
obj.child.method(p1, p2)
func.call(context, p1, p2)

都可以归根为第三种形式

func.call(context, p1, p2)

当我们使用func()时没有指定context,浏览器会遵循规则:

如果你传的 context 就 null 或者 undefined,那么 window 对象就是默认的 context(严格模式下默认 context 是 undefined)

如果需要改变context,在call中传入:

obj.foo.call(obj) //this指向obj

事件监听器中的this

btn.addEventListener('click' ,function handler(){
  console.log(this) // 请问这里的 this 是什么
})

当事件触发时,handler中实际上调用了

handler.call(event.currentTarget, event);
//所以this指向event.currentTarget

jQuery中监听器的this

jQuery文档:

当jQuery的调用处理程序时,this关键字指向的是当前正在执行事件的元素。对于直接事件而言,this 代表绑定事件的元素。对于代理事件而言,this 则代表了与 selector 相匹配的元素。(注意,如果事件是从后代元素冒泡上来的话,那么 this 就有可能不等于 event.target。)若要使用 jQuery 的相关方法,可以根据当前元素创建一个 jQuery 对象,即使用 $(this)。

箭头函数的this值

箭头函数中this指向定义时所在的对象

var app = {
    fn1() {
        setTimeout(function(){
            console.log(this)
        }, 10)
    },
    fn2() {
        setTimeout(()=>{
            console.log(this)
        },20)
    },
    fn3() {
        setTimeout((function(){
            console.log(this)
        }).bind(this), 30)        
    },
    fn4: ()=> {
        setTimeout(()=>{
            console.log(this)
        },40)        
    }
}

以fn4为例,40ms后调用()=>{console.log(this)}中this指向fn4中的this,也就是App,但fn4本身也是箭头函数,所以fn4中this还要找App定义时所在对象也就是windows。

以此我们可以得出简单结论

所以如果你在箭头函数里面看到 this ,就当作是它外面的函数的 this 即可。

如何改变this的指向

自己写call/apply:

function handlerWrapper(event){
  function handler(){
    console.log(this) // 请问这里的 this 是什么
  }

  handler.call({name:'饥人谷'}, event)
}
btn.addEventListener('click', handlerWrapper)

或者使用bind,bind后返回的是一个函数名

btn.addEventListener('click', function(){
  console.log(this) // 请问这里的 this 是什么
}.bind({name:'饥人谷'}))

相关文章

  • JS进阶篇-this指向问题

    JS中this的指向问题不同于其他语言,JS中的this不是指向定义它的位置,而是在哪里调用它就指向哪里。 JS中...

  • JS中this指向

    一、全局作用域中的thises5与es6中严格模式与非严格模式全局函数的this都指向window 二、全局作用域...

  • JS中this指向

    函数有4种调用方式,对应就有4种绑定规则:默认绑定、隐式绑定、硬绑定和构造函数绑定。 1、默认绑定 当作为普通函数...

  • js中this指向

    1.this总是指向函数的直接调用者2.如果有new关键字,this指向new出来的那个对象3.DOM事件中thi...

  • JS中this指向

    (1)事件调用环境:谁触发事件,函数里面的this指向就是谁(某个DOM)。 (2)node全局环境:this指向...

  • js中this指向

    当我们需要把函数当做另外函数参数传入时,我们使用箭头函数。 关于this的指向。 问题:箭头函数中的this是如何...

  • JS中this的指向

    什么是this? 它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。 JS中this的指向,取...

  • JS中this的指向

    JS中this的指向 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考...

  • JS中this的指向

    1、普通函数中this的指向( 普通函数中的this指针指向于调用者) 2、定时器中的this的指向 3、在对象...

  • JS中THIS的指向?

    大家好,我是IT修真院北京分院第22期的学员杨纲,一枚正直纯洁善良的WEB前端程序员。 1.背景介绍 this对象...

网友评论

      本文标题:JS中this的指向

      本文链接:https://www.haomeiwen.com/subject/lfcquctx.html