2013-08-07 5 views
0

У меня есть привычка делать вопросы без необходимости, включив вне темы и бесполезные тирады. На этот раз я постараюсь не делать этого. Прошу прощения за отсутствие лучшего и более наглядно название.Редактор плагинов CoffeeScript и jQuery

Итак, вот код CoffeeScript.

(($, window, document) -> 

    # Conventionally 'private' variables 
    _name  = 'aPlugin' 
    _defaults = 
    property: 'value' 

    _debug = (args) -> 
    console.log args 
    return 

    # Plugin constructor 
    Plugin = (element, options) -> 
    @element = element 
    @options = $.extend true, {}, _defaults, options 

    @init() 
    return 

    # Initialization 
    Plugin.prototype.init =() -> 
    # Initialization logic here 
    _debug(@element) unless typeof(@element)=='undefined' 
    return 

    # Plugin wrapper, allowing for multiple instances 
    # and chainability 
    $.fn[_name] = (options) -> 
    return @.each (idx) -> 
     ($.data @, 'plugin_' + _name 
     new Plugin @, options 
    ) unless $.data @, 'plugin_' + _name 
    return 

) jQuery, window, document 

Вот тот же код, скомпилированный (или скомпилированный) на JavaScript.

(function() { 
    (function($, window, document) { 
    var Plugin, _debug, _defaults, _name; 
    _name = 'aPlugin'; 
    _defaults = { 
     property: 'value' 
    }; 
    _debug = function(args) { 
     console.log(args); 
    }; 
    Plugin = function(element, options) { 
     this.element = element; 
     this.options = $.extend(true, {}, _defaults, options); 
     this.init(); 
    }; 
    Plugin.prototype.init = function() { 
     if (typeof this.element !== 'undefined') { 
     _debug(this.element); 
     } 
    }; 
    $.fn[_name] = function(options) { 
     return this.each(function(idx) { 
     if (!$.data(this, 'plugin_' + _name)) { 
      $.data(this, 'plugin_' + _name); 
      return new Plugin(this, options); 
     } 
     }); 
    }; 
    })(jQuery, window, document); 

}).call(this); 

И, просто чтобы быть ясно, я называю этот плагин так:

jQuery(document).ready(function($) { 
    $('#specialDiv').aPlugin({ aString: 'Hello world!', aNumber: 62742, aObject: { aString: 'Hello aPlugin!', aNumber: 6274210 } }); 
}); 

options аргумент в плагине вызова не имеет никакого значения. Это для целей тестирования.

У меня есть два вопроса:

  1. в переводе, JavaScript, предполагаемый код был автоматически завернутые в (function(){}).call(this). Я этого раньше не видел. Что оно делает? Это безопасно? Тем не менее, это несколько стандарт кодирования (поскольку CoffeeScript делает это). Что-то добавить здесь: я новичок в CoffeeScript, поэтому это может быть побочным продуктом неуместной скобки или чего-то еще. Тем не менее, похоже, это не мешает операции.
  2. Когда код выполнен, я получаю <div id="specialDiv"> </div>. В коде вы можете увидеть, что я вызывал console.log() с вызывающим (который должен быть объектом jQuery) в качестве аргумента. Где он распаковывается?

Благодарим вас за ваше время.

+0

Я написал простой шаблон/оболочку jQuery plugin, который может вам пригодиться. См. Https://github.com/davesag/coffeescript-jquery-plugin-template. Он завершен с проверками QUnit, является 100% Coffeescript и демонстрирует как генерировать мини-файлы с помощью sourceMaps. –

ответ

1
  1. CoffeeScript делает это автоматически, чтобы гарантировать, что каждая неявно глобальная переменная рассматривается как локальная переменная внутри области действия оболочки. Явная глобальная переменная все еще может быть выполнена с window.myGlobal = 3 или, на верхнем уровне в CoffeeScript, с @myGlobal = 3. Это хороший способ написать JavaScript. Поэтому, когда вы пишете x = 3 или window = { } в CoffeeScript, они рассматриваются как назначения локальных переменных, а не глобальных переменных.

  2. Поскольку console не является локальной переменной - это не входит в таблицу локальных переменных-заключающей любого лексической области - Резервный JavaScript, чтобы попытаться его как глобальную переменную, эффективно window.console.

Вам не нужно затенять jQuery, window и document себя при использовании CoffeeScript. В CoffeeScript все неявно глобальные переменные являются локальными: CoffeeScript защитит вас таким же образом, что защита этих переменных в JavaScript будет защищать вас.

+0

В комментариях ранее я просил уточнить (2). Я удалил комментарии, потому что теперь я полностью понимаю ваш ответ на (2).Это единственный ответ, и он содержит удовлетворительные ответы на оба моих вопроса, я отмечаю это как принятый ответ. –

+0

Рад, что я мог помочь. – yfeldblum

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