2016-01-22 2 views
1

У меня есть следующие JS:Сделать объект метод постоянной вместо значения закрытия в JavaScript/CoffeeScript

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) 

Что это должно сделать генерировать методы экземпляра для переключения между объектами инструмента. Вместо tool, ссылающийся на каждый отдельный объект объекта с каждым отдельным методом switch_to_, он заканчивает ссылкой на то, какое значение tool осталось в закрытии.

Что бы я хотел сделать, это сделать инструмент постоянным в методе. Это возможно?

ответ

1

из кофе Документов

При использовании цикла 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.

Смежные вопросы