无法从闭包内输出正确的变量值

时间:2012-09-21 08:36:19

标签: javascript jquery jquery-plugins

我正在尝试将https://github.com/stepanvr/js-shortcuts jquery插件用于键盘快捷键。但是我遇到了这个问题。我在json数据结构中定义了快捷方式数据。然后我遍历这些快捷方式,当输出按下的快捷方式时,报告错误的快捷方式。无论我按哪一个快捷键,我都会按Ctrl + Shift + P组合报告。我相信它与JavaScript如何处理这个处理函数有关。

var data = {
    'name' : 'Eclipse (Java)',
    'version' : '1.0',
    'hotkeys' : {
        'Navigation' : {
            'Ctrl+Shift+R'      : 'Open / Search for resources, e.g. files',
            'Ctrl+Shift+T'      : 'Open / Search for Types',
            'Ctrl+E'            : 'Allows to select an editor',
            'Ctrl+F8'           : 'Shortcut for switching perspectives',
            'Alt+Left'          : 'Go to previous/ next editor position in history',
            'Ctrl+PageUp'       : 'Switch to previous/next editor',
            'F3'                : 'Go to the declaration of this variable',
            'Ctrl+Shift+P'      : 'Go to the matching bracket'
        }
    }
};

var verify = function(msg) {
    var node = document.getElementById('debug');
    node.innerHTML += msg + ' ';
};

$(document).ready(function() {
    for (var x in data.hotkeys.Navigation) {
        $.Shortcuts.add({
            type:'down',
            mask:x,
            handler:function () {
                verify(x);
            }
        });
    }
    $.Shortcuts.start();
});

1 个答案:

答案 0 :(得分:2)

你的问题在于设置回调的范围,x变量随着循环的进行而改变,你必须将它包装在一个闭包中,如下所示:

  for (var x in data.hotkeys.Navigation) {
    (function(x){
      $.Shortcuts.add({
          type:'down',
          mask:x,
          handler:function () {
              verify(x);
          }
      });
    })(x);
  }