2014-07-01 48 views
0

问题:如何访问shortcutaction或其他局部变量的javascript:通过局部变量的匿名函数

相关:类似的问题,但没有成功:

Java解决方案: 设置final改性剂,在匿名函数需要

目标源代码变量:

//plugin.buttons is collection of button objects 
for (var i in plugin.buttons) { 
    var button = plugin.buttons[i]; 
    var icon = button.icon; 
    var text = button.text; 
    var shortcut = button.shortcut; 
    var action = button.action; //action is a function (or method) 

    if (shortcut != null && shortcut.length > 0) { 
     if ($.isFunction(action)) { 
      console.log(shortcut); //it's valid shortcut 
      //using jQuery hotkey plugin 
      $('div[contenteditable]').bind('keydown', shortcut, function() { 
       console.log(shortcut); //it's undefined 
       action.call(); //it's undefined also 
       return false; 
      }); 
     } 
    } 
} 
+0

如图所示,因为JS可以通过关闭...编辑到达那些瓦尔它应该只是工作:哎呦,在功能包住for循环,这是书中缺乏循环范围的最古老的主要解决方法。 – dandavis

回答

2

你可以把它作为event data

for (var i in plugin.buttons) { 
    var button = plugin.buttons[i]; 
    var icon = button.icon; 
    var text = button.text; 
    var shortcut = button.shortcut; 
    var action = button.action; //action is a function (or method) 

    if (shortcut != null && shortcut.length > 0) { 
     if ($.isFunction(action)) { 

      $('div[contenteditable]').on('keydown', {shortcut : shortcut}, function (e) { 

       console.log(e.data.shortcut); 

      }); 
     } 
    } 
} 

但是在这种情况下,真正的问题是在for循环中没有特殊的作用域,因此在for循环中定义变量只是在每次迭代时覆盖相同的变量,这就是为什么当事件处理程序将在稍后调用。

你必须在变量锁定在一个新的范围

for (var key in plugin.buttons) { 
    (function(i) { 
     var button = plugin.buttons[i]; 
     var icon = button.icon; 
     var text = button.text; 
     var shortcut = button.shortcut; 
     var action = button.action; //action is a function (or method) 

     if (shortcut != null && shortcut.length > 0) { 
      if ($.isFunction(action)) { 
       console.log(shortcut); //it's valid shortcut 
       //using jQuery hotkey plugin 
       $('div[contenteditable]').bind('keydown', shortcut, function() { 
        console.log(shortcut); //it's undefined 
        action.call(); //it's undefined also 
        return false; 
       }); 
      } 
     } 
    })(key); 
} 
+1

for循环的非范围东西呢? – dandavis

+0

@dandavis - 哦,你说得对,for循环没有范围,所以每次迭代都会覆盖变量。将它们作为事件数据传递会解决这个问题,但是一个IIFE会更加合理,现在改变这个答案。 – adeneo

+0

你的第一个答案对我来说不起作用,因为第二个参数必须是一个字符串来处理jQuery Hotkey。但你的第二个答案是很好的解决方案,并且运作良好谢谢。 – Behnam