2013-10-06 2 views

ответ

1

Что-то вроде этого:

f -> 
    ... 
(x, y) 

немного неоднозначным в CoffeeScript поскольку (x, y) является корректным выражением на своих собственных. Так как вещи вида f(g(x)) и f(g) являются более распространенными, чем f(g)(x), неоднозначность решена в виде двух утверждений:

f -> ... 

и

(x, y) 

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

foo.bar(-> 
    doSomething() 
)(x, y) 

Это становится this JavaScript:

foo.bar(function() { 
    return doSomething(); 
})(x, y); 

Это может или не может иметь тот же эффект, как JavaScript, вы пытаетесь достичь. Если foo.bar заботится о возвращаемом значении аргумента то

return doSomething(); 

и просто

doSomething(); 

могут быть весьма различны; неявное «возвращение значения последнего выражения» в CoffeeScript может вас отвлечь. Одним из примеров будет jQuery's each, который прекратит итерирование, если функция итератора вернется ровно false, но продолжит работу, если итератор ничего не возвращает (т. Е. undefined). Если ваш foo.bar ведет себя таким образом, то вы можете явно указать, что аргумент foo.bar «S ничего не возвращает:

foo.bar(-> 
    doSomething() 
    return 
)(x, y) 

Это станет this JavaScript:

foo.bar(function() { 
    doSomething(); 
})(x, y); 

, и это именно то, что вы находясь в поиске.

Вы можете также использовать указанную функцию вместо анонимного одного:

pancakes = -> 
    doSomething() 
foo.bar(pancakes)(x, y) 

У вас еще есть возможная return проблема уже отмечалось выше (и вы решаете, что точно так же), но, возможно, эта структура будет легче вы читаете и работаете; Я часто реорганизую вещи таким образом, если анонимная функция получает больше 5-10 строк, так как это упрощает мне структуру глазного шара.

0

Да, CoffeeScript не позволяет все JS может , из-за наших имплицитов. Просто используйте круглые скобки, будьте явными;).

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