为什么全局变量在javascript的局部作用域中赋值后仍保持未定义状态
我对闭包属性的理解是,函数范围内的每个变量都可以访问函数所在父范围内的所有变量 因此,考虑到这个定义,我不理解下面代码的行为:为什么全局变量在javascript的局部作用域中赋值后仍保持未定义状态,javascript,Javascript,我对闭包属性的理解是,函数范围内的每个变量都可以访问函数所在父范围内的所有变量 因此,考虑到这个定义,我不理解下面代码的行为: var mouseX, mouseY; window.onload = function() { this.addEventListener('mousemove', function() { mouseX = event.clientX; mouseY = event.clientY }); // mouseX an
var mouseX, mouseY;
window.onload = function() {
this.addEventListener('mousemove', function() {
mouseX = event.clientX;
mouseY = event.clientY
}); // mouseX and mouseY are defined
petObj = new Pets();
}
function Pets(){
document.getElementById('imageList').addEventListener('mouseenter',function()
{
console.log(mouseX)} //undefined mouse X!!!
}
我接受在匿名函数中为mousemove事件侦听器分配mouseX,以引用在函数外部声明的全局变量。但正如您所看到的,它在匿名函数的作用域之外保持未定义状态您正在设置事件处理程序的“load”处理程序中记录“mouseX”的值。尚未发生任何事件,因此变量仍
未定义
变量是可用的,如果您在事件处理程序中放置一个console.log()
调用,或者在某些“mousemove”事件发生后代码将运行的其他地方,您将看到值正在更新。我将变量的名称从mouseX更改为mouseXX,它可以工作,但不确定它为什么工作,也许jquery名称空间弄乱了变量名我也在pet对象中检查了它,它似乎也没有定义:(,感谢您指出之前应该处理好这个问题asking@Snedden27直到“mousemove”出现时,它才被定义事件已成功处理。我确实处理了鼠标移动事件,并分配了它,但mouseX在pets()函数中仍然未定义。如果您能解释一下为什么认为console.log()
call应该打印鼠标坐标值,它可能会帮助其他人为您提供更好的解释。