Подтвердить что ты не робот

Как написать это лямбда-закрытие в CoffeeScript?

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

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

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

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

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

Ошибка: Ошибка анализа в строке 1: Неожиданный "BOOL"

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

4b9b3361

Ответ 1

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

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

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

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

Источник CoffeeScript [попробуйте]
(($, window) ->
  $ ->
    alert "js!"
)(jQuery, window)

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

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

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

Ответ 2

do ($, window) ->
  $ ->
    alert "js!"

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

(function($, window) {
  return $(function() {
    return alert("js!");
  });
})($, window);