我有以下JS:
for (k in tools) {
tool = tools[k];
this["switch_to_" + tool.name] = (function(_this) {
return function() {
return _this.switch_tool(tool);
};
})(this);
}从此coffeescript生成:
for k,tool of tools
@["switch_to_#{tool.name}"] = =>
@switch_tool(tool)这应该做的是生成用于在工具对象之间切换的实例方法。在调用每个不同的switch_to_方法时,tool不会引用每个不同的工具对象,而是最终引用闭包中剩下的任何tool值。
我想做的是让tool成为方法中的一个常量。这个是可能的吗?
发布于 2016-01-23 05:40:42
来自Coffee文档:
当使用JavaScript循环生成函数时,通常会插入一个闭包包装器,以确保循环变量是封闭的,并且所有生成的函数都不只是共享最终值。CoffeeScript提供了
do关键字,该关键字可以立即调用传递的函数,并转发任何参数。
所以你的解决方案是
for k,tool of tools
do (tool) ->
@["switch_to_#{tool.name}"] = =>
@switch_tool(tool)它生成以下JS (您可以看到它现在工作的原因):
var fn, k, tool;
fn = function(tool) {
return this["switch_to_" + tool.name] = (function(_this) {
return function() {
return _this.switch_tool(tool);
};
})(this);
};
for (k in tools) {
tool = tools[k];
fn(tool);
}根据您的情况,您可能需要在do之后使用fat数组=>。
https://stackoverflow.com/questions/34956284
复制相似问题