recherche
Maisoninterface Webjs tutorielSuivez-moi pour apprendre les compétences de pré-analyse javascript var et de déclaration de fonction enhancement_javascript

1. pré-compilation des variables var

La syntaxe de JavaScript est similaire à C, Java et C#, collectivement appelés syntaxe de type C. Les étudiants ayant de l'expérience en programmation C ou Java doivent connaître la règle « déclarer d'abord, utiliser plus tard ». Si vous utilisez des variables ou des fonctions non déclarées, une erreur sera signalée lors de la phase de compilation. Cependant, JavaScript peut utiliser des variables et des fonctions avant qu'elles ne soient déclarées. Examinons de plus près le mystère ci-dessous.

Regardons d'abord un morceau de code :

(function() {
 console.log(noSuchVariable);//ReferenceError: noSuchVariable is not defined
})();

Exécutez le code ci-dessus et une erreur sera signalée immédiatement. Cependant, c'est exactement ce à quoi nous nous attendions, car la variable noSuchVariable n'a pas du tout été définie ! Jetons un coup d'œil au code suivant :

(function() {
 console.log(declaredLater); //undefined
 var declaredLater = "Now it's defined!";
 console.log(declaredLater);// "Now it's defined!"
})();

Tout d’abord, le code ci-dessus est correct et il n’y a aucun problème. Mais pourquoi ne signale-t-il pas d’erreur ? La variable déclaréeLater est définie après l'instruction appelante ? Pourquoi la sortie n'est-elle pas définie ?

Cela est en fait dû à l'analyseur JavaScript. L'analyseur place toutes les variables et fonctions déclarées dans la portée actuelle au début de la portée. Cependant, seule la déclaration des variables est avancée au début de la portée. sont laissés en place. Le code ci-dessus ressemble en fait à ceci pour l'analyseur :

(function() {
 var declaredLater; //声明被提前到作用域开始处了!
 console.log(declaredLater); // undefined
 declaredLater = "Now it's defined!"; //赋值操作还在原地!
 console.log(declaredLater);//"Now it's defined!"
})();

C'est pourquoi le code ci-dessus ne signale pas d'exception ! Une fois les variables et les fonctions "avancées", la variable déclaréeLater est en fait placée devant la fonction appelante. Selon la définition de la syntaxe JavaScript, les variables qui ont été déclarées mais non affectées seront automatiquement affectées à undefined. La valeur de la variable déclaréeLater n'est pas définie. Plus tard, nous avons attribué une valeur à la variable déclaréeLater, donc lorsque nous imprimons la variable pour la deuxième fois, elle est maintenant définie !

Regardons un autre exemple :

var name = "Baggins";
(function () {
 console.log("Original name was " + name);// "Original name was undefined"
 var name = "Underhill";
 console.log("New name is " + name);// "New name is Underhill"
})();

Dans le code ci-dessus, nous déclarons d'abord un nom de variable. Notre intention initiale est de générer la variable de nom définie dans la portée globale lors de la première impression de la variable de nom, puis de définir une variable de nom locale dans la fonction pour couvrir les variables globales et enfin afficher la valeur de la variable locale. Cependant, le premier résultat est totalement incohérent avec nos attentes. La raison en est que les variables locales que nous avons définies sont « avancées » dans leur portée, c'est-à-dire qu'elles prennent la forme suivante :

var name = "Baggins";
(function () {
 var name; //注意:name 变量被提前了!
 console.log("Original name was " + name);// "Original name was undefined"
 name = "Underhill";
 console.log("New name is " + name);//"New name is Underhill"
})();

Étant donné que JavaScript a de telles « bizarreries », il est recommandé de placer la déclaration de variable en haut de la portée, afin que vous puissiez toujours vous rappeler d'y prêter attention.

2. La déclaration de fonction est "avancée"

Ce dont j'ai parlé plus tôt, ce sont les variables, parlons ensuite des fonctions.

Il existe deux situations dans lesquelles une fonction est "avancée", l'une est une déclaration de fonction et la seconde est une fonction assignée à une variable en tant que valeur, c'est-à-dire une expression de fonction.

Parlons d'abord de la première situation, le code :

isItHoisted();//"Yes!"
function isItHoisted() { 
 console.log("Yes!");
}

Comme indiqué ci-dessus, l'interpréteur JavaScript vous permet de l'utiliser avant la déclaration de fonction. En d'autres termes, la déclaration de fonction n'est pas seulement le nom de la fonction qui est « avancée », mais la définition entière de la fonction est également « avancée » ! Le code ci-dessus peut donc être exécuté correctement.

Regardons le deuxième cas : la forme d'expression de fonction. Commençons par le code :

definitionHoisted();// "Definition hoisted!"
definitionNotHoisted();// TypeError: undefined is not a function
function definitionHoisted() { 
 console.log("Definition hoisted!");
}
var definitionNotHoisted = function () { 
 console.log("Definition not hoisted!");
};

Nous avons fait une comparaison. La fonction definitionHoisted a été correctement exécutée, conforme au premier type ; la variable definitionNotHoisted était "avancée", mais son affectation (c'est-à-dire la fonction) n'était pas avancée de ce point de vue. pour dire, cela est tout à fait cohérent avec "l'avancement" des variables dont nous avons parlé plus tôt, et comme la valeur par défaut de la variable "avancement" n'est pas définie, l'erreur signalée appartient à "l'incompatibilité de type", car undéfini n'est pas une fonction, bien sûr, on ne peut pas l'appeler.

Résumé
Grâce à l'explication ci-dessus, cela peut se résumer ainsi :

La déclaration des variables est avancée en haut du scope, et l'affectation reste en place
La déclaration de fonction entière est "avancée"
Lors de l'utilisation d'une expression de fonction, seule la variable est "avancée", la fonction n'est pas "avancée"
3. Effets secondaires du var

Une petite différence entre les variables globales implicites et les variables globales explicitement définies est la possibilité de laisser les variables non définies via l'opérateur de suppression.

Les variables globales créées via var (créées dans n'importe quel programme en dehors des fonctions) ne peuvent pas être supprimées.
Les variables globales implicites créées sans var (qu'elles soient créées ou non dans une fonction) peuvent être supprimées.
Cela montre que, techniquement, les variables globales implicites ne sont pas vraiment des variables globales, mais ce sont des propriétés de l'objet global. Les attributs peuvent être supprimés via l'opérateur delete, mais les variables ne le peuvent pas :

// 定义三个全局变量
var global_var = 1;
global_novar = 2;  // 反面教材
(function () {
 global_fromfunc = 3; // 反面教材
}());

// 试图删除
delete global_var;  // false
delete global_novar; // true
delete global_fromfunc; // true

// 测试该删除
typeof global_var;  // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"

在ES5严格模式下,未声明的变量(如在前面的代码片段中的两个反面教材)工作时会抛出一个错误。

4、单var形式声明变量

在函数顶部使用单var语句是比较有用的一种形式,其好处在于:

提供了一个单一的地方去寻找功能所需要的所有局部变量
防止变量在定义之前使用的逻辑错误
少代码(类型啊传值啊单线完成)
单var形式长得就像下面这个样子:

function func() {
 var a = 1,
  b = 2,
  sum = a + b,
  myobject = {},
  i,
  j;
 // function body...
}

您可以使用一个var语句声明多个变量,并以逗号分隔。像这种初始化变量同时初始化值的做法是很好的。这样子可以防止逻辑错误(所有未初始化但声明的变量的初始值是undefined)和增加代码的可读性。在你看到代码后,你可以根据初始化的值知道这些变量大致的用途。

以上就是针对javascript的var预解析与函数声明提升的学习内容,希望对大家的学习有所帮助。

Déclaration
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
Javascript et le web: fonctionnalité de base et cas d'utilisationJavascript et le web: fonctionnalité de base et cas d'utilisationApr 18, 2025 am 12:19 AM

Les principales utilisations de JavaScript dans le développement Web incluent l'interaction client, la vérification du formulaire et la communication asynchrone. 1) Mise à jour du contenu dynamique et interaction utilisateur via les opérations DOM; 2) La vérification du client est effectuée avant que l'utilisateur ne soumette les données pour améliorer l'expérience utilisateur; 3) La communication de rafraîchissement avec le serveur est réalisée via la technologie AJAX.

Comprendre le moteur JavaScript: détails de l'implémentationComprendre le moteur JavaScript: détails de l'implémentationApr 17, 2025 am 12:05 AM

Comprendre le fonctionnement du moteur JavaScript en interne est important pour les développeurs car il aide à écrire du code plus efficace et à comprendre les goulots d'étranglement des performances et les stratégies d'optimisation. 1) Le flux de travail du moteur comprend trois étapes: analyse, compilation et exécution; 2) Pendant le processus d'exécution, le moteur effectuera une optimisation dynamique, comme le cache en ligne et les classes cachées; 3) Les meilleures pratiques comprennent l'évitement des variables globales, l'optimisation des boucles, l'utilisation de const et de locations et d'éviter une utilisation excessive des fermetures.

Python vs JavaScript: la courbe d'apprentissage et la facilité d'utilisationPython vs JavaScript: la courbe d'apprentissage et la facilité d'utilisationApr 16, 2025 am 12:12 AM

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

Python vs JavaScript: communauté, bibliothèques et ressourcesPython vs JavaScript: communauté, bibliothèques et ressourcesApr 15, 2025 am 12:16 AM

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

De C / C à JavaScript: comment tout cela fonctionneDe C / C à JavaScript: comment tout cela fonctionneApr 14, 2025 am 12:05 AM

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

Moteurs JavaScript: comparaison des implémentationsMoteurs JavaScript: comparaison des implémentationsApr 13, 2025 am 12:05 AM

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

Au-delà du navigateur: Javascript dans le monde réelAu-delà du navigateur: Javascript dans le monde réelApr 12, 2025 am 12:06 AM

Les applications de JavaScript dans le monde réel incluent la programmation côté serveur, le développement des applications mobiles et le contrôle de l'Internet des objets: 1. La programmation côté serveur est réalisée via Node.js, adaptée au traitement de demande élevé simultané. 2. Le développement d'applications mobiles est effectué par le reactnatif et prend en charge le déploiement multiplateforme. 3. Utilisé pour le contrôle des périphériques IoT via la bibliothèque Johnny-Five, adapté à l'interaction matérielle.

Construire une application SaaS multi-locataire avec next.js (intégration backend)Construire une application SaaS multi-locataire avec next.js (intégration backend)Apr 11, 2025 am 08:23 AM

J'ai construit une application SAAS multi-locataire fonctionnelle (une application EdTech) avec votre outil technologique quotidien et vous pouvez faire de même. Premièrement, qu'est-ce qu'une application SaaS multi-locataire? Les applications saas multi-locataires vous permettent de servir plusieurs clients à partir d'un chant

See all articles

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 moisBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Vous avez un jeu croisé?
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

MinGW - GNU minimaliste pour Windows

MinGW - GNU minimaliste pour Windows

Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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