1. Visão geral das funções anônimas
A primeira vez que conheci funções anônimas foi no código-fonte do jQuery. A primeira coisa que vi quando abri o jQuery foi.
Copie o código do código da seguinte forma:
(função( janela, indefinido ) {..........................})(janela);
Esta é uma função anônima, com parâmetros em vermelho. A função da função anônima é criar uma área fechada, e as variáveis e métodos internos não podem ser acessados pelo exterior.
Como não pode ser acessado, como o jquery pode ser chamado? Isso ocorre porque a função anônima do jquery possui estas duas frases (texto azul):
Copie o código do código da seguinte forma:
(função(janela, indefinido) {
//Define uma cópia local do jQuery
var jQuery = function(seletor, contexto) {
// O objeto jQuery é na verdade apenas o construtor init 'aprimorado'
retornar novo jQuery.fn.init(seletor, contexto);
},
.........
janela.jQuery = janela.$ = jQuery;
})(janela);
Acontece que jQuery é passado para window na função anônima, e é por isso que window é passado ao passar parâmetros, então toda vez que jquery for chamado no futuro, o objeto jQuery de window será realmente chamado.
jquery chama seus próprios métodos. Não pode ser chamado de fora, o que garante segurança e ausência de conflitos.
2. Continuando com o tópico acima, sobre plug-ins jQuery
A seguir está parte do código do controle de paginação que escrevi:
Copie o código do código da seguinte forma:
;(função($){
$.fn.tabing = função (arg) {
instância = novo Plugin(este, arg);
};
var instância = null;
função Plug-in(elemento){
this._tabs = $(elemento);
this._tabli = $("a[href*='#']",this._tabs);
this._tabDiv = this._tabs.siblings().filter("div[id*='tab']");
this.init();
}
Plugin.prototype = {
inicialização: função(){
this._tabli.addClass("desmarcado");
this._tabli.eq(0).addClass("selecionado");
this._tabDiv.css("exibir","nenhum");
this._tabDiv.eq(0).css("exibir","bloquear");
this._tabli.each(função(){
$(this).bind("clique",function(){
for(var i = 0;i<instance._tabDiv.length;i++){
instance._tabDiv.eq(i).css("display","none");
}
instance._tabDiv.filter("#"+$(this).attr("href").split('#')[1]).css("display","block");
});
})
}
}
})(jQuery);
Preste atenção às palavras vermelhas. Na verdade, os plug-ins jQuery também escrevem funções anônimas, o que garante a independência de cada plug-in. Caso contrário, não é chamado de plug-in. As palavras vermelhas $.fn.tabing indicam isso. há tabulação neste plug-in para fn do jquery.
Dessa forma, o objeto jquery externo pode chamar diretamente a tabulação, que também é o único contato entre o plug-in e o mundo externo.
3. Depois de falar sobre o uso de funções anônimas por plug-ins jquery, vamos falar sobre as funções anônimas de window
Na verdade, o próprio jquery é a função anônima de janela, que é o primeiro ponto. Então, como escrevemos a função anônima de janela?
Ou seja, após escrever a função anônima, existe uma interface para interagir com a janela da função, como a seguinte:
Copie o código do código da seguinte forma:
(função(){
função getObjByID(id){
retornar document.getElementById(id);
}
function __addClass(id,className,classValue){
$(id).style.className=classValue;
}
window.addClass=__addClass;
})();
Observe também as palavras vermelhas, para que você possa chamar addClass() fora da função anônima, mas não pode chamar getObjByID().
4. Funções anônimas também serão executadas durante a análise
do seguinte modo:
Copie o código do código da seguinte forma:
função Vídeo() { };
função Filme() { };
var _vídeo = novo Vídeo();
_vídeo.tamanho = 3;
_video.toString=função(){
retornar "vídeo";
};
_video.getName=função(){
retornar "VídeoXXX";
};
var _movie = new Filme();
(função (pai, filho) {
for (var ele no pai) {
if (!child[ele]) //Uma cópia do pai será copiada somente quando o filho não contiver o atributo ou método.
filho[ele] = pai[ele];
}
})(_video, _movie); //Como chamar a função anônima
alerta(_movie.size); //3
alert(_movie.toString()); //[objeto Objeto]
alerta(_movie.getName()); //VídeoXXX
Todos os três alertas apresentam resultados, indicando que a função anônima é executada internamente.