2

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

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

但是 Chrome 的 javascript 控制台一直说“未捕获的 ReferenceError: myvar is not defined all-products:203 (anonymous function)”

我究竟做错了什么?如何在这个函数之外访问这个变量?

编辑:我已经意识到我试图做的事情是不可行的。从那以后,我完全改变了我的策略,代码现在可以正常工作了。(感谢詹姆斯,尤其是弗拉德的帮助!)

4

2 回答 2

2

您需要将变量移动到两个代码都可以访问的外部范围。

var myvar = -1;

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

console.log(myvar);
于 2012-09-19T13:43:58.810 回答
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');
}); 

更新

var从 movemove 事件处理程序中删除了关键字。

依赖于 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:Ken,请马上测试仓库中的代码,完成测试后回家

console.log(myvar);

(此时,Ken 看到存储库是空的并回家了——那是因为 John 甚至在任务中都没有时间解决,所以 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。我希望我解释得足够让你理解。

于 2012-09-19T13:53:38.320 回答