javascript - setTimeout 内的函数调用未执行
问题描述
我正在delayFilter()
对输入框的 keyup 执行该功能。我想在用户停止输入并运行该功能后延迟 1 秒filterProducts()
。但是,在filterProducts()
setTimeout 内部执行时,我收到控制台错误“this.filterProducts 不是函数”。此函数在 setTimeout 之外被正常调用。为什么会抛出这个错误?
delayFilter() {
let timeout = null;
clearTimeout(timeout);
timeout = setTimeout(function() {
this.filterProducts();
}, 1000);
}
filterProducts() {
//do stuff
}
解决方案
那是因为这些,this 在回调内部,并没有引用外部的对象。
尝试这个:
delayFilter() {
let timeout = null;
clearTimeout(timeout);
let self = this;
timeout = setTimeout(function() {
self.filterProducts();
}, 1000);
}
filterProducts() {
//do stuff
}
你也可以试试箭头功能。原因可以看这里:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
箭头函数表达式是正则函数表达式的语法紧凑替代方案,尽管它没有绑定到 this、arguments、super 或 new.target 关键字。
delayFilter() {
let timeout = null;
clearTimeout(timeout);
timeout = setTimeout(() => {
this.filterProducts();
}, 1000);
}
filterProducts() {
//do stuff
}
推荐阅读
- testing - 在 rust 基准测试中使用条件编译函数
- javascript - 在 JavaScript 中按多个字段对对象数组进行排序根据输入数组中的对象位置而有所不同
- dax - DAX GENERATE & ALLNOBLANKROW 函数导致循环依赖
- python - 单击按钮后如何显示图像?
- wordpress - Register_block_style() 和性能:'(
- flutter - 如何在颤动中将背景图像添加到文本中?
- python - 如何根据内部字典中的值过滤字典
- android - 初始安装使用 fusedLocationProviderClient 获取位置时出错
- c# - 在接口中为具有不同返回类型的方法使用新关键字来包装/解包数据
- sql - 多个汇总的解决方法