在老项目中,我开始使用 laravel-mixES6 进行逐渐过渡。在这个过程中,发现了一个问题:当 jQuery箭头函数 一起使用时,$(this) 的含义会发生变化。

问题解释

这个问题主要是因为没有理解 箭头函数 的特性。箭头函数不会创建自己的 this 上下文,而是继承父作用域的 this

看下面的例子:

// 问题代码
$('.js-bottom-btn').click(() => {
    let flag = $(this).data('flag');
    // ...
});

在箭头函数中,this 不是指向被点击的元素,而是指向父作用域的 this(可能是 windowundefined)。

解决方案

根据 jQuery click 文档,可以使用以下方法解决:

方法 1: 使用传统函数

$('.js-bottom-btn').click(function() {
    let flag = $(this).data('flag');
    // ...
});

方法 2: 使用事件参数

$('.js-bottom-btn').click(event => {
    let flag = $(event.currentTarget).data('flag');
    // ...
});

其他常见场景

jQuery 的 .each() 方法中也会遇到类似问题:

// 问题代码
$("jquery-selector").each(() => {
  $(this).click();
});

需要修改为:

$("jquery-selector").each((index, element) => {
  $(element).click();
});

箭头函数和 this 绑定

箭头函数的一个主要特点是词法绑定(lexical binding)。这意味着:

  • 箭头函数不创建自己的 this 上下文
  • 箭头函数继承定义它的外部作用域的 this
  • 这种行为与传统函数不同,传统函数中的 this 是根据调用方式决定的

参考资料

– EOF –