Javascript 如何从匿名鼠标事件函数中访问变量?
我试图从外部访问变量myvar,如下所示:Javascript 如何从匿名鼠标事件函数中访问变量?,javascript,mouseevent,Javascript,Mouseevent,我试图从外部访问变量myvar,如下所示: $(document).mousemove(function(e){ var myvar = winHeight() + scrollY() - e.pageY; }); console.log(myvar); 但是Chrome的javascript控制台一直在说“uncaughtreferenceerror:myvar不是所有产品都定义的:203 (匿名功能) 我做错了什么?如何在此函数之外访问此变量 编辑:我意识到我试图做的事情是不可能
$(document).mousemove(function(e){
var myvar = winHeight() + scrollY() - e.pageY;
});
console.log(myvar);
但是Chrome的javascript控制台一直在说“uncaughtreferenceerror:myvar不是所有产品都定义的:203
(匿名功能)
我做错了什么?如何在此函数之外访问此变量
编辑:我意识到我试图做的事情是不可能实现的。我已经完全改变了我的策略,代码现在运行良好。(感谢James,特别是Vlad的帮助!)您需要将变量移动到一个外部作用域,该作用域可由两位代码访问
var myvar = -1;
$(document).mousemove(function(e){
myvar = winHeight() + scrollY() - e.pageY;
});
console.log(myvar);
您需要将变量移动到两位代码都可以访问的外部范围
var myvar = -1;
$(document).mousemove(function(e){
myvar = winHeight() + scrollY() - e.pageY;
});
console.log(myvar);
我认为这是javascript事件的工作。基本上,您有一个全局变量,它将在鼠标移动时更新。更新变量后,必须让其他组件知道变量已准备好进行处理 守则:
var myVar; // the global variable
// the function that will be caled when myVar has been changed
var myVarChangedHandler = function() {
console.log('myVar variable has been changed: ' + myVar);
}
// bind the event to the above event handler
$('body').bind('MyVarChangedEvent', myVarChangedHandler);
// instal mouse move event handler on document
$(document).mousemove(function(e){
myVar = winHeight() + scrollY() - e.pageY;
$('body').trigger('MyVarChangedEvent');
});
更新
从movemove事件处理程序中删除了var
关键字
依赖于myVar的代码应该放在myVarChangedHandler
函数中
我会尽我所能解释你的代码,其中的缺陷
你应该如何用类比来解决这个问题。
让我们看下面的代码(全局变量已更正)
假设您是一名程序员,是web开发部门的团队负责人
在一些不知名的公司里,你有一份一天要完成的任务清单(
我们的类比任务是每次鼠标移动时更新myvar
)
您拥有一个存储库(var myvar
)和两名开发人员:
- 开发者John(
)函数(e){myVar=…};
- 开发者Ken(
)console.log(myvar)
var myvar;
09:10你告诉约翰:
约翰,请完成这项任务,每次你完成每项任务
将其上载到存储库,并在工作时间结束后回家
$(document).mousemove(function(e){
myvar = winHeight() + scrollY() - e.pageY;
});
09:11你告诉肯:
Ken,请立即在存储库中测试代码,然后回家
已经完成测试
console.log(myvar);
(此时,Ken看到存储库是空的,就回家了——这是因为
约翰连一分钟内完成任务的时间都没有,所以肯没有什么要测试的。)
09:12你回家
09:12,办公室里只有约翰在做任务,你和肯已经离开家了
因为你没有别的事要做。
您的代码也会发生这种情况。您可以输出myvar
的值,但您甚至没有移动鼠标
因此,值当然是undefined
为了解决这个问题,我们添加了一些修改:
09:00你早上来办公室
09:05打开服务器电源(存储库)
09:10你告诉约翰:
John, please do this tasks and everytime you complete each task
uploaded it to the repository and tell Ken to test the code.
Go home after you have finished
09:11你告诉肯:
Ken, each time John tells you that he has completed a task,
fetch the code from the repository and test it.
Go home after he has finished
09:12你回家
09:12,约翰和肯都在办公室做他们的工作
在上面的例子中,ken是myVarChangedHandler=function(){…}代码>
当John告诉Ken他完成了任务时,实际发生了一件事(讲述),
当Ken确认John信号时,他开始测试(Ken是事件处理程序)
这就是javascript中事件驱动架构的工作原理。
我建议您放弃jquery、mootools等。。。并开始学习核心概念
还有基本的。重新设计轮子几次,然后返回jquery。
我希望我的解释足够让您理解。我认为这是javascript事件的工作。基本上,您有一个全局变量,它将在鼠标移动时更新。更新变量后,必须让其他组件知道变量已准备好进行处理
守则:
var myVar; // the global variable
// the function that will be caled when myVar has been changed
var myVarChangedHandler = function() {
console.log('myVar variable has been changed: ' + myVar);
}
// bind the event to the above event handler
$('body').bind('MyVarChangedEvent', myVarChangedHandler);
// instal mouse move event handler on document
$(document).mousemove(function(e){
myVar = winHeight() + scrollY() - e.pageY;
$('body').trigger('MyVarChangedEvent');
});
更新
从movemove事件处理程序中删除了var
关键字
依赖于myVar的代码应该放在myVarChangedHandler
函数中
我会尽我所能解释你的代码,其中的缺陷
你应该如何用类比来解决这个问题。
让我们看下面的代码(全局变量已更正)
假设您是一名程序员,是web开发部门的团队负责人
在一些不知名的公司里,你有一份一天要完成的任务清单(
我们的类比任务是每次鼠标移动时更新myvar
)
您拥有一个存储库(var myvar
)和两名开发人员:
- 开发者John(
函数(e){myVar=…};
)
- 开发者Ken(
console.log(myvar)
)
上午09:00您来到办公室(用户打开页面)
09:05打开服务器/存储库的电源
var myvar;
09:10你告诉约翰:
约翰,请完成这项任务,每次你完成每项任务
将其上载到存储库,并在工作时间结束后回家
$(document).mousemove(function(e){
myvar = winHeight() + scrollY() - e.pageY;
});
09:11你告诉肯:
Ken,请立即在存储库中测试代码,然后回家
已经完成测试
console.log(myvar);
(此时,Ken看到存储库是空的,就回家了——这是因为
约翰连一分钟内完成任务的时间都没有,所以肯没有什么要测试的。)
09:12你回家
09:12,办公室里只有约翰在做任务,你和肯已经离开家了
因为你没有别的事要做。
您的代码也会发生这种情况。您可以输出myvar
的值,但您甚至没有移动鼠标
因此,值当然是undefined
为了解决这个问题,我们添加了一些修改:
09:00你早上来办公室
09:05打开服务器电源(存储库)
09:10你告诉约翰:
John, please do this tasks and everytime you complete each task
uploaded it to the repository and tell Ken to test the code.
Go home after you have finished
09:11你告诉肯:
Ken, each time John tells you that he has completed a task,
fetch the code from the repository and test it.
Go home after he has finished
09:12你回家
09:12,约翰和肯都在办公室做他们的工作<