Coffeescript理解和闭包问题
我在将一些JavaScript转换为CoffeeScript时遇到了一个问题。基本问题是我从使用$.each改为使用CoffeeScript理解,现在我遇到了一个问题,即理解的最后一个值被捕获到闭包中。让我们从原始JavaScript开始:Coffeescript理解和闭包问题,coffeescript,Coffeescript,我在将一些JavaScript转换为CoffeeScript时遇到了一个问题。基本问题是我从使用$.each改为使用CoffeeScript理解,现在我遇到了一个问题,即理解的最后一个值被捕获到闭包中。让我们从原始JavaScript开始: function bindKeyboardControls(websocket) { var moveKeyMap = { Down: ['down', 's'], Up: ['up', 'w'], L
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文章。“做”正是我所需要的。非常感谢。