Как написать это лямбда-замыкание в CoffeeScript? - PullRequest
22 голосов
/ 24 августа 2011

Я пытаюсь воссоздать это популярное лямбда-закрытие jQuery с CoffeeScript:

(function($, window, undefined){
  $(document).ready(function(){
    ...
  });
})(jQuery, window);

Пока у меня есть это:

(($, window, undefined) ->
  $ ->
    alert "js!"
)(jQuery, window)

Я получаю эту ошибку:

Ошибка: ошибка синтаксического анализа в строке 1: неожиданный «BOOL»

Похоже, что undefined является причиной проблемы здесь.Есть идеи как обойти это?

Ответы [ 2 ]

54 голосов
/ 24 августа 2011

undefined - это ключевое слово в CoffeeScript. Вам не нужно гарантировать, что он определен правильно, поэтому вы можете забыть эту часть.

CoffeeScript предоставляет ключевое слово do, которое можно использовать для создания замыкания вместо использования синтаксиса выражений, вызываемых немедленно вызываемой функцией.

CoffeeScript Source попробуйте
do ($ = jQuery, window) ->  
  $ ->  
    alert "js!"
Скомпилированный JavaScript
(function($, window) {
  return $(function() {
    return console.log("js!");
  });
})(jQuery, window);

Приведенный выше синтаксис не поддерживается до CoffeeScript 1.3.1. Для более старой версии вам все равно нужно сделать это:

CoffeeScript Source [попробуйте]
(($, window) ->
  $ ->
    alert "js!"
)(jQuery, window)

Если вам интересно, вот как CoffeeScript обрабатывает undefined.

CoffeeScript Source [попробуйте]
console.log undefined
Скомпилированный JavaScript
console.log(void 0);

Вы можете видеть, что он не использует переменную undefined, а вместо этого использует оператор void JavaScript для получения неопределенного значения.

13 голосов
/ 24 августа 2011
do ($, window) ->
  $ ->
    alert "js!"

компилируется в

(function($, window) {
  return $(function() {
    return alert("js!");
  });
})($, window);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...