我对闭包属性的理解是,函数作用域内的每个变量都可以访问函数所在的父作用域中的所有变量,
所以考虑到这个定义我不明白我的代码的行为如下:
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!!!
}
Run Code Online (Sandbox Code Playgroud)
我接受在mousemove事件监听器的匿名函数中指定mouseX来引用在函数外声明的全局变量.但是你可以看到它在匿名函数范围之外保持未定义
您正在设置事件处理程序的"load"处理程序中记录"mouseX"的值.尚未发生任何事件,因此变量仍然存在undefined.
这些变量是可用的,如果你console.log()在事件处理程序中调用一个调用,或者在某个"mousemove"事件发生后代码运行,那么你会看到值被更新.