Coffeescript理解和闭包问题

Coffeescript理解和闭包问题,coffeescript,Coffeescript,我在将一些JavaScript转换为CoffeeScript时遇到了一个问题。基本问题是我从使用$.each改为使用CoffeeScript理解,现在我遇到了一个问题,即理解的最后一个值被捕获到闭包中。让我们从原始JavaScript开始: function bindKeyboardControls(websocket) { var moveKeyMap = { Down: ['down', 's'], Up: ['up', 'w'], L

我在将一些JavaScript转换为CoffeeScript时遇到了一个问题。基本问题是我从使用$.each改为使用CoffeeScript理解,现在我遇到了一个问题,即理解的最后一个值被捕获到闭包中。让我们从原始JavaScript开始:

function bindKeyboardControls(websocket) {
    var moveKeyMap = {
        Down: ['down', 's'],
        Up: ['up', 'w'],
        Left: ['left', 'a'],
        Right: ['right', 'd']
    };

    $.each(moveKeyMap, function (direction, keys) {
        $.each(keys, function (_, key) {
            $(document).bind('keydown', key, function () { move(websocket, direction); });
        });
    });
};
bindKeyboardControls = function(websocket) {
  var direction, key, keys, moveKeyMap, _i, _len;
  moveKeyMap = {
    Down: ['down', 's'],
    Up: ['up', 'w'],
    Left: ['left', 'a'],
    Right: ['right', 'd']
  };
  for (direction in moveKeyMap) {
    keys = moveKeyMap[direction];
    for (_i = 0, _len = keys.length; _i < _len; _i++) {
      key = keys[_i];
      $(document).bind('keydown', key, function() {
        return move(websocket, direction);
      });
    }
  }
  return null;
};
这是我第一次尝试使用CoffeeScript:

    bindKeyboardControls = (websocket) ->
    moveKeyMap =
        Down: ['down', 's']
        Up: ['up', 'w']
        Left: ['left', 'a']
        Right: ['right', 'd']        
    for direction, keys of moveKeyMap
        for key in keys
            $(document).bind('keydown', key, -> move(websocket, direction))
    null
为什么这样不行?下面是生成的JavaScript:

function bindKeyboardControls(websocket) {
    var moveKeyMap = {
        Down: ['down', 's'],
        Up: ['up', 'w'],
        Left: ['left', 'a'],
        Right: ['right', 'd']
    };

    $.each(moveKeyMap, function (direction, keys) {
        $.each(keys, function (_, key) {
            $(document).bind('keydown', key, function () { move(websocket, direction); });
        });
    });
};
bindKeyboardControls = function(websocket) {
  var direction, key, keys, moveKeyMap, _i, _len;
  moveKeyMap = {
    Down: ['down', 's'],
    Up: ['up', 'w'],
    Left: ['left', 'a'],
    Right: ['right', 'd']
  };
  for (direction in moveKeyMap) {
    keys = moveKeyMap[direction];
    for (_i = 0, _len = keys.length; _i < _len; _i++) {
      key = keys[_i];
      $(document).bind('keydown', key, function() {
        return move(websocket, direction);
      });
    }
  }
  return null;
};
我也可以继续使用$。每个。所以我确实有一些解决方案,但有更好的吗?

是的:

for direction, keys of moveKeyMap
  for key in keys
    do (direction, key) -> $(document).bind('keydown', key, -> move(websocket, d))

它创建并运行一个匿名函数,该函数捕获
方向
的值,以便
绑定
回调可以使用它们。有关这方面的更多信息,请参阅我的PragProg文章。

“做”正是我所需要的。非常感谢。