账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    事件绑定的this问题
    24
    0

    alpha方法挂在实例上

    beta方法挂在原型上

    它们打印出来的this却完全不同

    alpha打印出来是APP实例

    beta打印出来是button元素

    没想明白是为什么

    <button id="aa">aa</button>
    <button id="bb">bb</button>
    <script type="text/javascript">
        class APP {
            constructor() {
                this.alpha = () => {
                    console.log(this);
                }
                const $aa = document.querySelector('#aa');
                const $bb = document.querySelector('#bb');
                $aa.addEventListener('click', this.alpha);
                $bb.addEventListener('click', this.beta);
            }
    
            beta() {
                console.log(this);
            }
        }
    
        new APP();
    </script>
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 在JavaScript中,事件绑定的this关键字常常会引发一些困惑,主要是因为this在不同上下文中的指向不同。

      1. 在常规函数(非箭头函数)中直接定义并作为事件处理器时,this通常会指向触发该事件的DOM元素(在浏览器环境中)或者全局对象(在严格模式下为undefined)。

      例如: javascript var btn = document.getElementById('myButton'); btn.addEventListener('click', function() { console.log(this); // 这里this指向被点击的按钮元素 });

      1. 如果事件处理器是一个对象的方法,并且你将这个方法作为事件处理器,那么在方法内部的this将会指向调用该方法的对象,但在事件处理的上下文中,它通常不会指向DOM元素,而是全局对象(在浏览器中是window,在严格模式或模块环境下是undefined)。

      例如: ```javascript var obj = { button: document.getElementById('myButton'), clickHandler: function() { console.log(this); // 这里this指向obj,而不是被点击的按钮元素 } };

      obj.button.addEventListener('click', obj.clickHandler); ``` 为了解决这个问题,我们通常会采用以下几种方式:

      • 使用.bind()方法手动绑定thisjavascript obj.button.addEventListener('click', obj.clickHandler.bind(obj));
      • 使用箭头函数,箭头函数没有自己的this值,它会捕获其所在(即定义的位置)上下文的this值: ```javascript var obj = { button: document.getElementById('myButton'), clickHandler: () => { console.log(this); // 若在对象中定义,这里this指向obj;若在全局作用域定义,this指向全局对象 } };

      obj.button.addEventListener('click', obj.clickHandler); - 使用ES6的类方法,类方法默认会绑定到实例上,所以这里的`this`也会指向类的实例:javascript class MyClass { constructor() { this.button = document.getElementById('myButton'); }

      clickHandler() { console.log(this); // 这里this指向MyClass的实例 }

      init() { this.button.addEventListener('click', this.clickHandler); } } new MyClass().init(); ```

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部