• javascript中的this指向


    1.作为普通函数指向调用者

    btn.onclick = function () {
        console.log(this) //指向的是调用者btn
    }
    

    2.使用call apply bind改变this指向

    const user = {
        name: 'Jack'
    }
    btn.onclick = (function () {
        console.log(this)   //指向user
    }).call(user)
    

    3.作为对象方法被调用

    this即为当前对象

    const zhangsan = {
        name:'张三',
        sayHi(){
            console.log(this)//{ name: '张三', sayHi: [Function: sayHi] }
            console.log(this.name)//张三
        }
    }
    

    4.在class方法中调用

    constructor里面的this指向创建的实例

    函数里的this指向的是调用者

    class Star {
        constructor(name, age) {
            this.btn = document.querySelector('button')
            this.btn.onclick = this.sing //btn调用了sing,因此sing函数里的this指向btn
        }
        sing() {
            console.log(this) //证明函数里的this指向的是调用者btn
            console.log(this.name) //因为btn没有name属性,因此这里输出空undefined
        }
    }
    

    5.箭头函数

    • 函数体内的this对象,就是定义时所在的对象,不是使用时所在的对象。固定改变不了
    • 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
    • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
    • 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
    btn.onclick = () => {
        console.log(this)   //指向window
    }
    

    示例补充

    setTimeout()参数不同,this执行不同

    注意哦,setTimeout实际为window.setTimeout,所以左图this指向window。而右图使用了箭头函数,this指向函数定义时所在的对象

    事件中的this

    addEventListener()事件处理程序会在其所属元素的作用域内运行,但当用了箭头函数则会导致里面的this指向改变。因此不建议在创建事件的时候搭配箭头函数使用

    还需注意:另一种添加事件的方法attachEventIE事件处理程序会在全局作用域中运行,因此this = window。

    p2.addEventListener('click', function () {
        console.log(this)     //p2元素
    })
    p2.addEventListener('click', event => {
        console.log(this)    //window
    })
    

    综合题目-通用的事件绑定(包含代理)

    function bindEvent(element, type, selector, fn) {
        if (fn == null) { //避免不用代理时传element,type,fn
            fn = selector
            selector = null
        }
        console.log(this)   //window
         //这里箭头函数this指向的是函数bindEvent的作用域中的this,也就是window
        element.addEventListener(type, event => { 
            const target = event.target
            console.log(this)   //window
            if (selector) {
                // 代理
                if (target.matches(selector)) { //符合选择器
                    fn.call(target, event)   //将fn的this值绑定到target中
                }
            } else {
                //普通
                fn.call(target, event)
            }
        })
    }
    
    bindEvent(p1, 'click', function () {
        console.log('参数',this)   //这里的this指向用call改变过,指向target(这里是p1)
    })
    

    注意:上面调用函数bindEvent的时候,参数三不可以写成箭头函数的形式,因为箭头函数的this指向固定不可变(也就是说用bind、apply、call都无法改变,字面意思就是固定不变)

  • 相关阅读:
    MySQL解压版安装及使用
    bitmap海量数据的快速查找和去重
    docker折腾笔记
    #ST表,单调栈#洛谷 5648 Mivik的神力
    #矩阵树定理,高斯消元,容斥定理#洛谷 4336 [SHOI2016]黑暗前的幻想乡
    #割点,Tarjan#洛谷 5058 [ZJOI2004]嗅探器
    #树状数组#洛谷 5677 [GZOI2017]配对统计
    #2-sat,Tarjan#洛谷 4171 [JSOI2010]满汉全席
    #Splay#洛谷 1486 [NOI2004]郁闷的出纳员
    #扫描线,线段树#洛谷 3875 [TJOI2010]被污染的河流
  • 原文地址:https://www.cnblogs.com/L-xmin/p/12893863.html
Copyright © 2020-2023  润新知