如何从匿名鼠标事件函数中访问变量?

时间:2012-09-19 13:42:22

标签: javascript mouseevent

我正试图从外部访问变量 myvar ,如下所示:

$(document).mousemove(function(e){
    var myvar = winHeight() + scrollY() - e.pageY;
}); 
console.log(myvar);

但Chrome的javascript控制台一直说“未捕获的ReferenceError:myvar未定义所有产品:203 (匿名函数)“

我做错了什么?如何在此函数外部访问此变量?

编辑:我意识到我试图做的事情是无法实现的。我已经彻底改变了我的策略,现在代码工作正常。 (谢谢詹姆斯,特别是弗拉德的帮助!)

2 个答案:

答案 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 = ... };
  • 开发者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);

(此时,肯看到存储库是空的并且回家 - 那是因为 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。 我希望我解释得足以让你明白。