2012-05-23 8 views
1

CoffeeScript новичок здесь. У меня возникла странная проблема с объемом функции, которую я нажал на массив, а затем выполнил внутри функции-члена класса. В принципе, похоже, что this не устанавливается правильно.Проблемы с цветом CoffeeScript с набором функций

class TestClass 
    constructor: -> 
     @functions = [] # my array of functions 
     @member = "hello there! come find me!" 
    update: => 
     func() for func in @functions 

testClass = new TestClass 
testClass.functions.push(-> 
    str = "could i find @member? " + @member? + "; this's keys: " + Object.keys(this) 
    console.log(str) 
) 
testClass.update() 

В результате? Как ни странно, это:

could i find @member? false; this's keys: 
top,location,window,external,chrome,v8Locale,document,$,jQuery,CoffeeScript 

Похоже, что контекст, в котором функция вызывается неправильна. Я подумал, что, нажав функцию тощий стрелкой на мой массив, когда эта функция называется она принимает контекст, в котором она называется (update, где this является testClass) Все работает просто отлично, если я:

update: => 
     func.call(this) for func in @functions 

но это не выглядит очень CoffeeScript идиоматическим.

ответ

1

Создав свою функцию с помощью тощей стрелки, вы создаете анонимную функцию, где this, которая будет привязана к объекту window, а не к контексту, в котором он называется. this не поддерживает его значение для вызовов функций, если обе функции не связаны с одним и тем же контекстом.

Есть несколько способов, которые я могу решить, чтобы решить эту проблему, и хотя ни одна из них не является особенно уродливой, ни одна из них не является особенно элегантной.

Во-первых, это решение, которое вы предложили, когда вы связываете функцию внутри функции обновления. Во-вторых, похоже, но движется связывании в другом месте:

class TestClass 
    ... 
    addFunc: (func) -> 
     @functions.push(=> func.call(@)) 

testClass.addFunc(-> ...) 

Третий вариант будет использовать что-то вроде bind function from underscore.js привязать функцию к TestClass в точке она создана. Хотя это может оказаться более беспорядочным, чем другие 2 варианта.

+0

Хорошо, просто хотел убедиться, что не было более элегантного способа сделать это. Думаю, я пойду со своим вторым решением. Благодаря! –

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