范围问题Javascript

时间:2013-10-15 14:57:04

标签: javascript handlers

var isPressed =0;
document.body.onkeypress = function(evt)
{
  evt = evt || window.event;

    if (evt.keyCode!=='undefined') {
        // Do your stuff here
        isPressed = 1;
        console.log(isPressed);//Here it gives 1
    }
//return isPressed;
}
result = navigator.appVersion +"|"+n+"|"+getStyle(mydiv,'opacity')+"|"+history.length+"|"+metarefesh+"|"+hasFocus+"|"+navigator.platform+"|"+parent.top.document.referrer+"|"+activexenable+"|"+javaEnabled+"|"+hasFlash+"|"+navigator.plugins.length+"|"+ hasMouseMoved+"|"+isClicked +"|"+**isPressed**+"|"+isresized+"|"+isScrolled+"|"+getStyle(mydiv,'zIndex');

的console.log(结果);     console.log(isPressed)//即使我按下一个键并且它已经变为1,它也会给出零。

如果我在if循环中执行console.log(isPressed),它就可以工作。这是一个我不知道的范围问题。请帮忙。

提前致谢

2 个答案:

答案 0 :(得分:1)

问题是同步问题。您的代码读作:

  

按下某个键时,将isPressed设置为一个

     

显示isPressed

的值

第一条指令只说明将在稍后发生的事情并完成。在按下任何键之前,第二条指令立即跟随,因此它显示0.如果您要执行第三条指令:

window.setTimeout(function(){console.log(isPressed)}, 3000);

并在页面加载后立即按一个键(在3秒后通过),您将看到isPressed设置为1的日志。

如果您在按下某个键后需要执行其他逻辑,则需要将其放在注释“Do your stuff here”。

答案 1 :(得分:1)

以下是console.log输出原因的核心答案:

Javascript具有异步处理的事件概念。您可以在使用onkeypress事件时利用此功能。

JS文件的其余部分完成了它需要做的事情(包括设置事件),然后当事件被触发时(按下一个键)它运行里面的代码。

实际上JS文件正在这样做:

  1. 将变量isPressed设置为0
  2. 将此匿名函数设置为onkeypress
  3. isPressed记录到控制台。
  4. 每当onkeypress实际发生时,让我们运行我们在步骤2中设置的匿名函数。
  5. 当您到达第3步时,您实际上没有对isPressed变量做任何事情,因此它将其记录为0

    稍后,当您点击onkeypressed时,您实际上正在更改isPressed的值,因此它会记录为1


    您还应该注意绑定到onkeypress的匿名函数没有专门返回isPressed。您需要将return isPressed添加到底部(评论所在的位置)。

    由于这是一个绑定到事件的匿名函数,因此没有充分的理由这样做。该值不会出现在任何地方,如果您想操纵isPressed变量,那么您设置的范围是理想的。