Estou apenas começando a escrever plugins jQuery. Escrevi três plugins pequenos, mas simplesmente copiei a linha em todos os meus plugins sem realmente saber o que isso significa. Alguém pode me falar um pouco mais sobre isso? Talvez uma explicação seja útil algum dia ao escrever uma estrutura :)
O que isso faz? (Eu sei que estende o jQuery de alguma forma, mas há mais alguma coisa interessante para saber sobre isso)
(function($) {
})(jQuery);
Qual é a diferença entre as duas maneiras a seguir de escrever um plugin:
Tipo 1:
(function($) {
$.fn.jPluginName = {
},
$.fn.jPluginName.defaults = {
}
})(jQuery);
Tipo 2:
(function($) {
$.jPluginName = {
}
})(jQuery);
Tipo 3:
(function($){
//Attach this new method to jQuery
$.fn.extend({
var defaults = {
}
var options = $.extend(defaults, options);
//This is where you write your plugin's name
pluginname: function() {
//Iterate over the current set of matched elements
return this.each(function() {
//code to be inserted here
});
}
});
})(jQuery);
Eu poderia estar longe daqui e talvez tudo signifique a mesma coisa. Estou confuso. Em alguns casos, isso não parece estar funcionando em um plug-in que eu estava escrevendo usando o Tipo 1. Até agora, o Tipo 3 parece ser o mais elegante para mim, mas eu gostaria de saber sobre os outros também.
fonte
(function($) { })(jQuery);
agrupa o código para que$
fiquejQuery
dentro desse fechamento, mesmo que$
signifique algo fora dele, geralmente como resultado,$.noConflict()
por exemplo. Isso garante que seu plug-in funcione, independentemente de ser$ === jQuery
:) :)(function($) { })(jQuery)
você disse: "Eu sei que isso estende o jQuery de alguma forma [...]". Claramente você não sabe, pois sua afirmação é 100% falsa. A propósito, pode ser enganoso para futuros leitores. Dê uma olhada no seguinte: stackoverflow.com/a/32550649/1636522 .Respostas:
Em primeiro lugar, um bloco de código que se parece
(function(){})()
é apenas uma função que é executada no local. Vamos dividir um pouco.A linha 2 é uma função simples, entre parênteses, para informar ao tempo de execução que retorne a função ao escopo pai. Uma vez retornada, a função é executada usando a linha 4, talvez a leitura dessas etapas ajude
Você pode ver que 1 é a declaração, 2 está retornando a função e 3 está apenas executando a função.
Um exemplo de como seria usado.
Quanto às outras perguntas sobre os plugins:
Tipo 1: Este não é realmente um plugin, é um objeto passado como uma função, pois os plugins tendem a ser funções.
Tipo 2: novamente não é um plug-in, pois não estende o
$.fn
objeto. É apenas uma extensão do núcleo do jQuery, embora o resultado seja o mesmo. Isto é, se você deseja adicionar funções de deslocamento, como toArray e assim por diante.Tipo 3: este é o melhor método para adicionar um plug-in, o protótipo estendido do jQuery pega um objeto com o nome e a função do seu plug-in e o adiciona à biblioteca de plugins para você.
fonte
( function(){} )
: O que é isso exatamente? Não posso apenas escreverfunction(){}()
?No nível mais básico, algo do formulário
(function(){...})()
é uma literal de função que é executada imediatamente. O que isso significa é que você definiu uma função e a está chamando imediatamente.Este formulário é útil para ocultar e encapsular informações, pois qualquer coisa que você definir dentro dessa função permanecerá local para essa função e inacessível a partir do mundo exterior (a menos que você a exponha especificamente - geralmente por meio de um objeto literal retornado).
Uma variação desse formulário básico é o que você vê nos plug-ins do jQuery (ou neste padrão de módulo em geral). Conseqüentemente:
O que significa que você está passando uma referência ao
jQuery
objeto real , mas é conhecido como$
dentro do escopo da função literal.O tipo 1 não é realmente um plugin. Você está simplesmente atribuindo um literal de objeto a
jQuery.fn
. Normalmente, você atribui uma função,jQuery.fn
pois os plug-ins geralmente são apenas funções.O tipo 2 é semelhante ao tipo 1; você realmente não está criando um plugin aqui. Você está simplesmente adicionando um objeto literal a
jQuery.fn
.O tipo 3 é um plug-in, mas não é a melhor ou a maneira mais fácil de criar um.
Para entender mais sobre isso, dê uma olhada nesta pergunta e resposta semelhante . Além disso, esta página apresenta alguns detalhes sobre a criação de plugins.
fonte
Uma ajudinha:
fonte
Apenas pequena adição à explicação
Essa estrutura
(function() {})();
é denominada IIFE (Expressão de Função Imediatamente Invocada) e será executada imediatamente, quando o intérprete atingir essa linha. Então, quando você estiver escrevendo estas linhas:isto significa que o intérprete chamará a função imediatamente e passará
jQuery
como um parâmetro, que será usado dentro da função como$
.fonte
Na verdade, este exemplo me ajudou a entender o que
(function($) {})(jQuery);
significa.Considere isto:
E agora considere isso:
jQuery
é uma variável que contém o objeto jQuery.$
é um nome de variável como qualquer outro (a
,$b
,a$b
etc.) e que não tem nenhum significado especial como em PHP.Sabendo que podemos dar uma outra olhada no nosso exemplo:
fonte
Tipo 3, para funcionar, seria assim:
Não tenho certeza por que alguém usaria estender apenas a configuração direta da propriedade no protótipo jQuery, está fazendo exatamente a mesma coisa apenas em mais operações e mais desordem.
fonte