javascript - 在 JS 中使用多个参数访问函数中的对象范围

标签 javascript ecmascript-6

我得到了这个功能:

const debounce = (func, delay) => {
  let inDebounce;

  return function() {
    const context = this
    const args = arguments
    clearTimeout(inDebounce)
    inDebounce = setTimeout(() => func.apply(context, args), delay)
  }
}

var likes_btn = document.getElementsByClassName("js-submit-like");

for (var i = 0; i < likes_btn.length; i++) {
  likes_btn[i].addEventListener('click', debounce(function(el) {
    alert("hello");

    el.preventDefault();
  }, 500));
}

所以问题是,我需要在执行去抖动之前使用 .preventDefault() 。目前,真正发生的是在 debounce() 末尾执行,而不是在函数作用域中执行。

如何访问函数作用域?谢谢!

最佳答案

只需将其移到去抖动器回调之外即可:

const debouncer = debounce(() => alert("hello"), 500);
likes_btn[i].addEventListener('click', function(event) {
   event.preventDefault();
   debouncer(event);
});

使用一些链式函数可能会更优雅:

 const both = (fn1, fn2) => (...args) => (fn1(...args), fn2(...args));
 const stop = event => event.preventDefault();
 const listen = (el, name, handler) => el.addEventListener(name, handler);

 for(const btn of likes_btn) {
   listen(btn, "click", both(
    debounce(() => alert("hello"), 500),
    stop
   ));
}

关于javascript - 在 JS 中使用多个参数访问函数中的对象范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090006/

相关文章:

javascript - 更改 case 语句中的变量

javascript - 解构数组获得第二个值?

javascript - 使用过滤器返回 Promise.all 的 promise 数组不起作用

ecmascript-6 - 嵌套es6数组解构?

javascript - Angular - 错误类型错误 : _co. timeIn 不是函数

php - 未确定的字符串文字错误

javascript - Mongoose 。设置生存时间到特定字段

javascript - 使用 ReactJs 在搜索列表中突出显示匹配的字母/单词

reactjs - 如何优化 webpack/es6 开销?

javascript - ES6 中 'let' 关键字的作用域是什么(请看下面的代码片段)