回到上一片文章的那道面试题:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <input type="text" id="input" value=""> <script> var input = document.getElementById('input'); for(var i=0;i<3;i++){ setTimeout(function(){ input.value=i; },2000) } </script> </body> </html>
|
这道题目的初衷是考察对js异步和闭包的掌握,
但我对这个实现效果开始感兴趣:输入框的值两秒后变成0,再隔两秒后变成1,再隔两秒后变成2。
如何实现呢?在上篇文章讲过:即使用了闭包,结果依然不是我们想要的。
因为我们想要的效果每一步都依赖于上一步,只有等到上一步执行完,两秒后再执行下一步。
而在上篇文章中,每次都是一次性输出0,1,2,我们没法控制这个逻辑。
怎么解决呢?
其实很简单,函数嵌套。
setTimeout(function(){ input.value=0; setTimeout(function(){ input.value=1; setTimeout(function(){ input.value=2; },2000) },2000) },2000)
|
写过node的同学想必非常熟悉这个结构,这只有三层嵌套,但你们可能接触过十几层的嵌套。
你们晕吗?反正我不晕,我觉得代码挺简洁,也挺直观的。