我正试图从外部访问变量 myvar ,如下所示:
$(document).mousemove(function(e){
var myvar = winHeight() + scrollY() - e.pageY;
});
console.log(myvar);
但Chrome的javascript控制台一直说“未捕获的ReferenceError:myvar未定义所有产品:203 (匿名函数)“
我做错了什么?如何在此函数外部访问此变量?
编辑:我意识到我试图做的事情是无法实现的。我已经彻底改变了我的策略,现在代码工作正常。 (谢谢詹姆斯,特别是弗拉德的帮助!)
答案 0 :(得分:2)
您需要将变量移动到外部作用域,这两个代码都可以访问。
var myvar = -1;
$(document).mousemove(function(e){
myvar = winHeight() + scrollY() - e.pageY;
});
console.log(myvar);
答案 1 :(得分:2)
我认为这是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
函数中。
我会尽力解释你的代码中最好的代码,它的缺陷 以及如何使用类比来解决问题。 让我们采用以下代码(全局变量更正)
var myvar;
$(document).mousemove(function(e){
myvar = winHeight() + scrollY() - e.pageY;
});
console.log(myvar);
假设您是程序员,他是Web开发部门的团队负责人
在某个未命名的公司,你有一份工作日要完成的任务清单(
我们类比中的任务是每次鼠标移动时更新myvar
您可以使用存储库(var myvar
)和2个开发人员:
function(e) { myVar = ... };
)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);
(此时,肯看到存储库是空的并且回家 - 那是因为 John在一分钟内没有时间解决任务,所以肯没有什么可测试的。
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,John和Ken都在办公室工作。在上述情况下,ken为myVarChangedHandler = function() {...};
当John告诉Ken他完成了任务时,会发生一个真实的事件(告诉), 当Ken确认John开始测试时(Ken是事件处理程序)
这是javascript中事件驱动架构的工作原理。 我建议你放弃jquery,mootools等......并开始学习核心概念 和基础知识。重新转动轮子几次然后回到jquery。 我希望我解释得足以让你明白。