2016-02-11 2 views
0

Я пытаюсь понять разницу между следующими двумя наборами кода. Когда я использую определение плагина jquery, я могу получить доступ к плагину вне встроенной функции. Однако, если я попытаюсь просто установить некоторые объекты с одной и той же встроенной функцией, это не сработает.Почему мой объект недоступен в документе?

Это работает:

(function($) { 
    $.fn.test = function(message) { 

     return this.each(function() { 
      $(this).text(message); 
     }); 

    } 

}(jQuery)); 

$(document).ready(function() { 
    $('p').test('This works!'); 
}); 

не работает:

(function($) { 


var neato={ 
    start:function(){ 
     $('p').html('We must have an issue of scope or similar, this does not work'); 
    } 
} 


}(jQuery)); 

$(document).ready(neato.start); 

Есть ли способ, чтобы сделать свой объект доступным за пределами закрытой функции самоуправления в этом случае?

+1

'$ .fn = jQuery.prototype'. Другими словами, добавив свойство к '$ .fn', вы добавляете это свойство в прототип объекта jQuery. И объект jQuery возвращается из вызовов jQuery (например, '$ (document)'). – Stryner

ответ

5

Вся цель помещения кода внутри IIFE состояла в том, чтобы обеспечить, чтобы внешний код не мог получить доступ к переменным внутри него. Если вы хотите получить к нему доступ, вам придется прикрепить его к переменной, объявленной вне этой области действия, поэтому в вашем примере глобальный объект $. Кроме того, вы можете прикрепить его к окну:

(function ($) { ... 
    .... 
    window.neato = neato; 
})(jQuery); 

$(document).ready(neato.start); 
+0

Хорошо, и я, конечно, хочу поддерживать эту защиту области и не допускать доступа к другим вещам. Нет проблем, чтобы просто позвонить моему документу в рамках IIFE? – absentx

+1

Нет проблем вообще – sahbeewah

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