var str = '123';console.log(str); // 123



Premier sujet JavaScript : promotion et précompilation de variables
Table des matières
- Avant-propos
- 1. 2. Pré-analyse des Js
- 3. Priorité entre les promotions
- 4. ES6
- Écrit à la fin
Tutoriel vidéo Javascript)
Avant-propos
Cet article est la "Série avancée spécialisée JavaScript" 》Le premier article de la série, la série entière comprendra probablement, par exemple :- Limitation anti-tremblement
- Aplatissement
- Copie profonde et superficielle
- Déduplication de tableau
- Tri
- …
Specialized Advanced car ils ont un "taux d'apparition" élevé à de nombreuses reprises. Afin d'éviter d'être transformés en , la "JavaScript Specialized Advanced Series" est née ! ! ! google内容搜索师
1. Phénomènes intéressants
Selon le bon sens, le code JavaScript doit être exécuté de haut en bas. une chaîne, et bien sûr vous devez déclarer un à l'avance. Si je peux comprendre la vérité profonde, alors je lis le code suivant. 保存string类型的变量
var str = '123';console.log(str); // 123
Copier après la connexion
Changeons la position du code et regardons-le à nouveau :
var str = '123';console.log(str); // 123
console.log(str); // undefinedvar str = '123';
Il me semble avoir trouvé un modèle !! !
Après avoir lu les deux premiers morceaux de code et mené une "réflexion approfondie", il me semble avoir trouvé le modèle, c'est-à-dire : dans la fonction après le bloc de code actuel, utiliser des variables dans la variable déclaration et initialisation, Vous n'obtiendrez pas la valeur correcte. 之前
var val = '余光';(function(){ console.log(val); // 余光})();
déclaration et initialisation des variables Jésus ne peut pas m'empêcher d'obtenir la valeur de val, je l'ai dit ! ! !
Quand j'ai vu le morceau de code suivant, j'étais déjà secoué, quelque chose devait être louche.var val = '余光';(function(){ console.log(val); // undefined var val = '测试';})();
2. Pré-analyse Js
Dans la portée actuelle, peu importe où la variable est déclarée, cela sera fait les coulisses Un mouvement invisible. Remarque :Seules les déclarations sont "déplacées" . Autrement dit, la déclaration et l'affectation sont passivement séparées à un moment donné. Et ce mouvement invisible est en réalité . Js在编译阶段的解析
name = '余光'; // 未添加关键字(未声明),name为全局变量,,即window.name = '余光'var name; // 再次声明name,此时name未进行初始化,它的值是undefined吗?console.log(name); // ?
mouvement invisible est-ce que cela se produit pendant la pré-analyse Js (compilation).
2.1 Core : Pré-analyseAfin de comprendre ce problème principal, nous devons vérifier que le moteur compilera d'abord le code JavaScript avant de l'interpréter. Une partie de la phase de compilation consiste à rechercher toutes les déclarations et à les associer à la portée appropriée. Les amis intéressés peuvent lire les deux articles "Objets variables en JavaScript" et "De la portée à la chaîne de portée" ~ Par conséquent, lorsque de telles choses se produisent, y compris et 变量
Toutes les déclarations incluses seront traitées avant n'importe quel code est exécuté. Quand vous voyez 函数
;, vous pourriez penser que c'est une déclaration. Mais JavaScript voit en fait cela comme deux déclarations : var a; et a = 2;. var a = 2
- La première déclaration de définition est faite lors de la phase de compilation.
- La deuxième instruction d'affectation sera laissée en place en attendant son exécution.
// 我们看到的代码:var name = '余光';
// 声明(Declaration)var name; // 声明但未初始化,所以分配 undefined// 初始化(Initialization)name = '余光'; // 初始化(赋值)
var name; // 声明name提到作用域顶部,并被分配了一个undefinedname = '余光'; // 进行初始化操作console.log(name); // '余光'
Seules les déclarations seront promues, tandis que les affectations et autres logiques de code ne prendront effet que lorsque le code sera exécuté. Il y aura donc le problème suivant : La fonction
foo();function foo(){ console.log(name); // undefined var name = '余光';}
foo();function foo(){ console.log(name); // undefined var name = '余光';}
function foo(){ var name; // 声明 console.log(name); // undefined name = '余光'; // 初始化}foo(); // 函数执行
3. Priorité entre les promotions
Maintenant que nous savons que et 变量
seront promus, comment juger entre elles. Et la priorité ? 函数
3.1 函数会被首先提升,然后才是变量
我们分析下面的代码:
foo();var foo; // 1function foo(){ console.log('余光');}foo = function(){ console.log('小李');}
本着函数优先提升的原则,他会被解析成这样:
function foo(){ console.log('余光');}foo(); // 余光foo = function(){ console.log('小李');}
注意,var foo
因为是一个重复声明,且优先级低于函数声明
所以它被忽略掉了。
3.2 函数字面量不会进行函数提升
最直观的例子,就是在函数字面量前调用该函数:
foo();var foo = function(){ console.log(1);}// TypeError: foo is not a function
这段程序中:
- 变量标识符
foo
被提升并分配给所在作用域(在这里是全局作用域),因此在执行foo()时不会导致ReferenceError(),而是会提示你foo is not a function
。 - 然后就是执行foo,foo此时并没有赋值(注意变量被提升了)。由于对undefined值进行函数调用而导致非法操作,因此抛出TypeError异常。
四、ES6和小结
ES6新增了两个命令let
和const
,用来声明变量,有关它们完整的概念我会在《ES6基础系列》中总结,提起它们,是因为变量提升在它们身上不会存在。
4.1 变量提升是可以规避的
let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;
上面代码中,变量foo用var命令声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。
在变量提升上,const和let一样,只在声明所在的块级作用域内有效,也不会变量提升
4.2 小结
- 变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部,但变量的初始化不会提升;
- 函数提升:函数声明可以被看作是函数的整体被提升到了代码的顶部,但函数字面量表达式并不会引发函数提升;
- 函数提升优先与变量提升;
- let和const可以有效的规避变量提升
最后提炼一下:JavaScript引擎并不总是按照代码的顺序来进行解析。在编译阶段,无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理,这个过程被称为提升。声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。
相关免费学习推荐:javascript(视频)
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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 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

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 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 : 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

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 : 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 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.
