Maison interface Web js tutoriel Comment jQuery appelle-t-il sa fonction anonyme auto-appelante ?

Comment jQuery appelle-t-il sa fonction anonyme auto-appelante ?

Aug 01, 2018 pm 04:04 PM
javascript

Cet article vous présente comment jQuery appelle les fonctions anonymes auto-appelantes ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

Ouvrez le code source de jQuery. Vous verrez d'abord cette structure de code :

(function(window,undefined ){
})();
Copier après la connexion

Il s'agit d'une fonction anonyme à appel automatique. Quels trucs ? Dans la première parenthèse, créez une fonction anonyme ; dans la deuxième parenthèse, exécutez-la immédiatement

Pourquoi créer une telle « fonction anonyme auto-appelante » ?
En définissant une fonction anonyme, un espace de noms "privé" est créé. Les variables et méthodes de cet espace de noms ne détruiront pas l'espace de noms global. C'est très utile et c'est une fonctionnalité qu'un framework JS doit prendre en charge. jQuery est utilisé dans des milliers de programmes JavaScript. Il faut s'assurer que les variables créées par jQuery ne peuvent pas entrer en conflit avec les variables utilisées par le programme qui l'importe.
Ensuite, examinons quelles fonctions sont implémentées dans les fonctions anonymes auto-appelantes, classées dans l'ordre du code :

(function( window, undefined ) {
// 构造jQuery对象
var jQuery = function( selector, context ) {
    return new jQuery.fn.init( selector, context, rootjQuery );
}
// 工具函数 Utilities
// 异步队列 Deferred
// 浏览器测试 Support
// 数据缓存 Data
// 队列 queue
// 属性操作 Attribute
// 事件处理 Event
// 选择器 Sizzle
// DOM遍历
// DOM操作
// CSS操作
// 异步请求 Ajax
// 动画 FX
// 坐标和大小
window.jQuery = window.$ = jQuery;
})(window);
Copier après la connexion

Les fonctions anonymes sont appelées littéraux de fonction syntaxiquement. La syntaxe JavaScript doit entourer les fonctions anonymes. . Entre parenthèses, en fait, il existe deux manières d'écrire des fonctions anonymes auto-appelantes :

(function() {
console.info( this );
console.info( arguments );
}( window ) );
Copier après la connexion
(function() {
console.info( this );
console.info( arguments );
})( window );
Copier après la connexion

Pourquoi devez-vous passer dans window ?

En passant la variable window, la fenêtre passe d'une variable globale à une variable locale. Lors de l'accès à la fenêtre dans le bloc de code jQuery, il n'est pas nécessaire de restaurer la chaîne de portée au niveau supérieur. scope, ce qui peut être plus rapide. Accédez à la fenêtre ; ce n'est pas la clé. Plus important encore, passer la fenêtre en paramètre peut être optimisé lors de la compression du code. Jetez un œil à jquery-1.6.1.min.js : (fonction. (a,b){} )(window); // la fenêtre est optimisée pour être un
Grâce à l'introduction ci-dessus, nous comprenons à peu près que () peut exécuter une expression de fonction immédiatement.

La fonction anonyme sert de "conteneur". L'intérieur du "conteneur" peut accéder aux variables externes, mais l'environnement externe ne peut pas accéder aux variables à l'intérieur du "conteneur".
Donc ( function(){. ...} )() Les variables définies en interne n'entreront pas en conflit avec les variables externes, communément appelées « wrappers anonymes » ou « espaces de noms ».

(function () {
// ... 所有的变量和function都在这里声明,并且作用域也只能在这个匿名闭包里
// ...但是这里的代码依然可以访问外部全局的对象
}());
Copier après la connexion

Identique à ci-dessous
(function () {/ code interne/})();

En termes simples, () est utilisé pour find la valeur, donc this () ne peut à aucun moment être vide car il doit être calculé. L'analyse des fonctions n'analysera que {}, pas ().

Mettre une expression dans () renverra la valeur de l'expression ;
Mettre une fonction dans () renverra la fonction elle-même (function(){}());
If ( ) qui suit immédiatement la fonction signifie que la fonction est appelée, c'est-à-dire que la fonction est évaluée : (function(){})();

(function() {
//自执行函数中的内部变量,外部是无法访问的
var name = 'kevin';
})( window );
Copier après la connexion

name //indéfini, la valeur de name ne peut pas être obtenu

Lorsque le code sera exécuté, il donnera la priorité à l'analyse de la [fonction déjà déclarée]

                                                                                                  utiliser   utiliser utiliser utiliser                              ‐      ‐ ‐ ‐‐‐'‐'‐ � � � � � Il est écrit séparément, son exécution nécessite donc l'appel d'autres fonctions. Les fonctions anonymes habituellement vues sont passées en paramètres. La fonction d'exécution immédiate elle-même est une fonction anonyme,
        L'ordre d'exécution du code js :                                                                                                                                                                                 //Expression de fonction var test = fonction (){}
                                                                     //                                                                                                                //  , il y a quelques points à comprendre :

1. Si vous souhaitez ajouter des parenthèses après le corps de la fonction pour l'appeler immédiatement, la fonction doit être une expression de fonction, pas une déclaration de fonction
2. Exécutez la fonction immédiatement. scope. Les variables externes sont accessibles à l'intérieur de la portée, mais l'environnement externe ne peut pas accéder aux variables à l'intérieur de la portée. Par conséquent, la fonction d'exécution immédiate est une portée fermée et n'interagira pas avec le conflit externe.
JQuery utilise cette méthode, en encapsulant le code JQuery dans (function (window, undefined){...jquery code...} (window), lors de l'appel du code JQuery dans la portée globale, vous pouvez protéger les variables internes de JQuery

3. Le mode module est un mode avancé de fonctions auto-exécutables. Il est très pratique d'appeler des fonctions de fermeture en tant qu'objets globaux dans chaque fermeture anonyme.

Le mode module est :
a. . Créez une expression de fonction anonyme qui est appelée immédiatement
b. Renvoyez une variable qui contient l'élément que vous souhaitez exposer
c. La variable renvoyée sera affectée à window

<. 🎜>/


Ce qui précède est l'analyse des fonctions anonymes auto-appelantes, alors comment une telle fonction est-elle appelée

(function () {
var i = 0;
return {
    get: function () {
        return i;
    },
    set: function (val) {
        i = val;
    },
    increment: function () {
        return ++i;
    }
};
} (window));
Copier après la connexion
    // window作为一个带有多个属性的全局对象,上面的代码对于属性的体现其实是方法,它可以这样调用:
    window.get(); // 0
    window.set(3);
    window.increment(); // 4
    window.increment(); // 5

    window.i; // undefined 因为i不是返回对象的属性
    i; // 引用错误: i 没有定义(因为i只存在于闭包)
Copier après la connexion

*/< ? 🎜>/Ce qui suit concerne l'appel de variables globales, c'est-à-dire l'appel de la fonction de fermeture anonyme*
/Sortez à nouveau du mode ModuleMode Module, c'est-à-dire la création et l'appel de fermetures anonymes :

   a.创建一个立即调用的匿名函数表达式
   b.return一个变量,其中这个变量里包含你要暴露的东西
      c.返回的这个变量将赋值给window
Copier après la connexion

window(或者是任意一个全局对象)作为一个带有多个属性的全局对象,也可以把window当成一个参数,以对象的方式,在其它函数中实现调用。用下面的例子说明:

(function ($, YAHOO) {
// 这里,我们的代码就可以使用全局的jQuery对象了,YAHOO也是一样
$.aa = function(){
    //code
}
} (jQuery, YAHOO));
//调用 jQuery.aa();
Copier après la connexion

下面是一个标准的Module模式,通过匿名函数的返回值来返回这个全局变量:

var blogModule = (function () {
var my = {}, privateName = "博客园";

function privateAddTopic(data) {
    // 这里是内部处理代码
}

my.Name = privateName;
my.AddTopic = function (data) {
    privateAddTopic(data);
};

return my;
} ());
//调用 blogModule.my();
Copier après la connexion

在一些大型项目里,将一个功能分离成多个文件是非常重要的,因为可以多人合作易于开发。再回头看看上面的全局参数导入例子,我们能否把blogModule自身传进去呢?答案是肯定的,我们先将blogModule传进去,添加一个函数属性,然后再返回就达到了我们所说的目的:

var blogModule = (function (my) {
my.AddPhoto = function () {
    //添加内部代码  
};
return my;
} (blogModule || {}));
Copier après la connexion


(function (my){
my.AddPhoto = function () {
    //添加内部代码  
};
return my;
})(blogModule || {}));
//调用 blogModule.AddPhoto();
Copier après la connexion

那么,多个自执行函数间是怎么调用的呢?

(function(owner) {
//第一个匿名闭包
owner.debug = true;
//Ajax相关参数配置
owner.ajax = {
    timeout: 10000,
    type: &#39;post&#39;,
    dataType: &#39;json&#39;,
};
})(window.C = {}));
Copier après la connexion

如果第二个函数想调用 全局变量为C中的 对象呢?要怎么写?

(function($, owner) {
//这里调用上面全局变量为C 中的对象呢
if(!C.debug) return false;
var url = &#39;aaa.html&#39;;
mui.ajax({
    url: url,
    dataType: C.ajax.dataType,
    type: C.ajax.type,
});
})(mui, window.app = {});
Copier après la connexion

再举个例子,同样的,不同自执行闭包函数间的调用方法:

(function($, owner) {
//获取语言闭包
owner.getLanguage = function() {
    var language = localStorage.getItem(C.state.field.language);
    if(typeof language == "undefined" || language === null || language == &#39;&#39;) {
        var currentLang = navigator.language;
        if(!currentLang)
            currentLang = navigator.browserLanguage;
        language = currentLang.toLowerCase();
        language = language.replace(/-/g, &#39;_&#39;);

        if(language != &#39;en_us&#39; && language != &#39;zh_cn&#39;)
            language = &#39;en_us&#39;;

        localStorage.setItem(C.state.field.language, language);
    }

    //在上面的解析中有说过,Module模式,return 一个变量,这个变量就是要爆露的东西。通过这个函数的全局变量,这个  language  可以在任何地方调用   
    //return一个变量,其中这个变量里包含你要暴露的东西 
    //全局调用  storage.language                                  
    return language;
};
})(mui, window.storage = {}));
Copier après la connexion
(function($, owner) {
owner.language = {};
owner.preload = function(settings){
    var defaults = {
        name: &#39;i18n&#39;,
        language: &#39;&#39;,
        path: &#39;/&#39;,
        cache: true,
        encoding: &#39;UTF-8&#39;,
        autoReplace: true,
        success: null,
        error: null,
    };
    
    settings = $.extend(defaults, settings);
    if(settings.language === null || settings.language == &#39;&#39;) {
        //全局调用  storage.language                                                                            
        settings.language = storage.getLanguage();
    }
}   
})(mui, window.i18n = {});
Copier après la connexion

所以 匿名闭包的调用规则是这样的,立即执行(最后一个括号) (window),如果把window作为一个参数进行传递,那么就把它以对象的方式,在其它函数中实现全局调用。

相关推荐:

js实现模态窗口增加与删除案例分享(纯代码)

js对象类型怎么判断?详解js里的基本类型转换

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de reconnaissance vocale en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 pm 02:54 PM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de reconnaissance vocale en ligne Introduction : Avec le développement continu de la technologie, la technologie de reconnaissance vocale est devenue une partie importante du domaine de l'intelligence artificielle. Le système de reconnaissance vocale en ligne basé sur WebSocket et JavaScript présente les caractéristiques d'une faible latence, d'un temps réel et d'une multiplateforme, et est devenu une solution largement utilisée. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de reconnaissance vocale en ligne.

WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel WebSocket et JavaScript : technologies clés pour mettre en œuvre des systèmes de surveillance en temps réel Dec 17, 2023 pm 05:30 PM

WebSocket et JavaScript : technologies clés pour réaliser des systèmes de surveillance en temps réel Introduction : Avec le développement rapide de la technologie Internet, les systèmes de surveillance en temps réel ont été largement utilisés dans divers domaines. L'une des technologies clés pour réaliser une surveillance en temps réel est la combinaison de WebSocket et de JavaScript. Cet article présentera l'application de WebSocket et JavaScript dans les systèmes de surveillance en temps réel, donnera des exemples de code et expliquera leurs principes de mise en œuvre en détail. 1. Technologie WebSocket

Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Comment utiliser JavaScript et WebSocket pour mettre en œuvre un système de commande en ligne en temps réel Dec 17, 2023 pm 12:09 PM

Introduction à l'utilisation de JavaScript et de WebSocket pour mettre en œuvre un système de commande en ligne en temps réel : avec la popularité d'Internet et les progrès de la technologie, de plus en plus de restaurants ont commencé à proposer des services de commande en ligne. Afin de mettre en œuvre un système de commande en ligne en temps réel, nous pouvons utiliser les technologies JavaScript et WebSocket. WebSocket est un protocole de communication full-duplex basé sur le protocole TCP, qui peut réaliser une communication bidirectionnelle en temps réel entre le client et le serveur. Dans le système de commande en ligne en temps réel, lorsque l'utilisateur sélectionne des plats et passe une commande

Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Comment mettre en œuvre un système de réservation en ligne à l'aide de WebSocket et JavaScript Dec 17, 2023 am 09:39 AM

Comment utiliser WebSocket et JavaScript pour mettre en œuvre un système de réservation en ligne. À l'ère numérique d'aujourd'hui, de plus en plus d'entreprises et de services doivent fournir des fonctions de réservation en ligne. Il est crucial de mettre en place un système de réservation en ligne efficace et en temps réel. Cet article explique comment utiliser WebSocket et JavaScript pour implémenter un système de réservation en ligne et fournit des exemples de code spécifiques. 1. Qu'est-ce que WebSocket ? WebSocket est une méthode full-duplex sur une seule connexion TCP.

JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel JavaScript et WebSocket : créer un système efficace de prévisions météorologiques en temps réel Dec 17, 2023 pm 05:13 PM

JavaScript et WebSocket : Construire un système efficace de prévisions météorologiques en temps réel Introduction : Aujourd'hui, la précision des prévisions météorologiques revêt une grande importance pour la vie quotidienne et la prise de décision. À mesure que la technologie évolue, nous pouvons fournir des prévisions météorologiques plus précises et plus fiables en obtenant des données météorologiques en temps réel. Dans cet article, nous apprendrons comment utiliser la technologie JavaScript et WebSocket pour créer un système efficace de prévisions météorologiques en temps réel. Cet article démontrera le processus de mise en œuvre à travers des exemples de code spécifiques. Nous

Comment utiliser insertBefore en javascript Comment utiliser insertBefore en javascript Nov 24, 2023 am 11:56 AM

Utilisation : En JavaScript, la méthode insertBefore() est utilisée pour insérer un nouveau nœud dans l'arborescence DOM. Cette méthode nécessite deux paramètres : le nouveau nœud à insérer et le nœud de référence (c'est-à-dire le nœud où le nouveau nœud sera inséré).

Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Tutoriel JavaScript simple : Comment obtenir le code d'état HTTP Jan 05, 2024 pm 06:08 PM

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace JavaScript et WebSocket : créer un système de traitement d'images en temps réel efficace Dec 17, 2023 am 08:41 AM

JavaScript est un langage de programmation largement utilisé dans le développement Web, tandis que WebSocket est un protocole réseau utilisé pour la communication en temps réel. En combinant les puissantes fonctions des deux, nous pouvons créer un système efficace de traitement d’images en temps réel. Cet article présentera comment implémenter ce système à l'aide de JavaScript et WebSocket, et fournira des exemples de code spécifiques. Tout d’abord, nous devons clarifier les exigences et les objectifs du système de traitement d’images en temps réel. Supposons que nous disposions d'un appareil photo capable de collecter des données d'image en temps réel.

See all articles