如何让addEventListener回调获取testvar新值?当前回调中testvar为undefined
解决addEventListener回调获取testvar新值的问题
嘿,这个问题其实是var变量作用域和重复声明的坑导致的!先给你拆解下原代码的问题:
原代码里最外层声明了var testvar,但在setTimeout的回调里又写了var testvar = "testvar value"——因为var是函数作用域,这里的var testvar会被变量提升,相当于在这个回调函数内部重新创建了一个局部变量testvar,和外层的那个完全不是同一个!所以外层的testvar始终是undefined,点击按钮自然打不出新值。
下面给你几种可行的解决方案:
方案1:去掉内部的var,直接修改外层变量
把setTimeout里的var去掉,这样就不会创建新的局部变量,而是直接给外层的testvar赋值:
var testvar; setTimeout(function(){ testvar = "testvar value"; // 去掉var,直接修改外层的testvar }, 3000); document.querySelector('#anotherButton').addEventListener('click', ()=>{ console.log('testvar '+testvar); });
方案2:用let替代var(更推荐)
let是块级作用域,不会有var的变量提升问题,而且如果不小心在内部重复声明会直接报错,更容易避免这类问题:
let testvar; setTimeout(function(){ testvar = "testvar value"; }, 3000); document.querySelector('#anotherButton').addEventListener('click', ()=>{ console.log('testvar '+testvar); });
额外说明
如果你的场景更复杂(比如需要等待异步操作完成后再处理),还可以用Promise或者async/await来管理,但针对当前的问题,上面两种方案已经完全能解决啦!
内容的提问来源于stack exchange,提问作者lordvcs
相关产品推荐
相关产品推荐

