javascript - 为什么有些回调函数只用“setTimeout(this.functions, 1000);”调用它们?但其他人需要有箭头功能才能工作
问题描述
例如,我有这个程序调用一些具有设定超时的函数,一些函数只是调用它们(setTimeout(this.siguienteNivel,1500);但其他需要(代码的最后一个)箭头函数,(setTimeout(( ) =>this.iluminarSecuenciaFinal();}, 1000 * i);) 如果缺少箭头函数,则该函数在这些特定情况下不会触发,我不明白为什么要区分这个,程序在一个类中,我不明白知道这是否有所作为
这是一块,如果需要,完整的代码是这样的: https ://github.com/moorooba/simon/blob/master/index.html
> elegirColor(ev) {
const nombreColor = ev.target.dataset.color;
const numeroColor = this.transformarColorANumero(nombreColor);
this.iluminarColor(nombreColor);
if (numeroColor === this.secuencia[this.subnivel]) {
this.subnivel++;
if (this.subnivel === this.nivel) {
this.nivel++;
this.eliminarEventosClick();
if (this.nivel === ULTIMO_NIVEL + 1) {
this.ganador();
} else {
setTimeout(this.siguienteNivel, 1500);
}
}
} else {
this.perdio();
}
}
// ganoElJuego() {
// swal("Platzi", "Felicitaciones, ganaste el juego!", "success").then(
// this.inicializar
// );
// }
// perdioElJuego() {
// swal("Platzi", "Lo lamentamos, perdiste :(", "error").then(() => {
// this.eliminarEventosClick();
// this.inicializar();
// });
// }
perdio() {
loser.classList.remove("hide");
setTimeout(this.startos, 1000);
this.eliminarEventosClick();
}
startos() {
loser.classList.add("hide");
boton.classList.remove("hide");
}
ganador() {
console.log("diparo");
this.eliminarEventosClick();
for (let i = 0; i < 4; i++) {
// setTimeout(this.iluminarSecuenciaFinal, 1000 * i);
setTimeout(() => {
this.iluminarSecuenciaFinal();
}, 1000 * i);
}
// setTimeout(this.ganoJuego, 4000);
setTimeout(() => {
this.ganoJuego();
}, 4000);
}
ganoJuego() {
console.log("ganojuego");
winner.classList.remove("hide");
// setTimeout(this.restart, 1500);
setTimeout(() => {
this.restart();
}, 1500);
}
解决方案
您必须了解this
JavaScript 的工作原理:
class Foo {
bar = 'bar';
log() {
console.log(this.bar);
}
method() {
setTimeout(this.log);
setTimeout(() => this.log());
}
}
const obj = new Foo;
obj.method();
在此示例中,(代表代码的相关部分)该method
函数尝试以log
两种不同的方式调用。
在第一个中,它将引用this.log
作为 的参数传递setTimeout
。该setTimeout
函数接收一个函数作为参数,它不知道声明它的上下文,就好像你从类中提取它一样。在这种情况下,当函数执行并评估为this
时正在评估。结果是因为是。window
undefined
window.bar
undefined
在第二个中,它传递一个箭头函数,其特殊性是在声明this
时保留。当它执行时,引用类的实例,因此结果与调用. 结果就是这种情况。this
obj.log()
'bar'
推荐阅读
- antlr - 在 ANTLR Lexer 规则中包含某些擒纵符号
- java - 空手道输入匹配
- common-lisp - Allegro common lisp in-package 不起作用
- node.js - Swagger 示例正文实现
- python - builtins.AttributeError: 'NoneType' 对象没有属性 'seek'
- kotlin - 除了 String() 之外,如何在 Kotlin 上将字节数组转换为字符串?
- javascript - 如何使用 patchValue 将值数组传递到一个多选列表视图中
- python - setattr 什么时候起作用?
- sql - 在子查询的外部查询中使用别名与不使用别名的区别
- sql - 动态列名 postgresql 触发器