但是并不会被提升
文章目錄
解析机制JavaScript是一门解释型的语言 , 想要运行js代码需要两个阶段
编译阶段: 编译阶段就是我们常说的JavaScript预解析(预措置惩罚惩罚)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码
执行阶段: 在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并从上到下按挨次执行
预解析时做什么var , function声明的变量提升 首先,,创建一个当前执行环境下的勾当东西,然后将用 var 声明的变量设置为勾当东西的属性(也就是将其添加到勾当东西傍边)并将其赋值为undefined,然后将 function 界说的函数 也添加到勾当东西傍边
2
3
4
5
6
7
if( false ){
var aa = 20;
var bb = 30;
}
function (){};
function BB(){};
var界说的aa,bb以及function界说的AA(),BB()城市被变量提升到window东西下面 提升后等同于如下代码:
2
3
4
5
6
7
8
var aa;
var bb;
function (){};
function BB(){};
if( false ){
aa = 20;
bb = 30;
}
注: 不是用var 界说的变量具有全局性, 但是并不会被提升, 只有在第一次执行到时才会呈此刻全局感化域中
函数声明与函数表达式在预解析的区别首先,我们知道解析器会对function界说的函数(也就是函数声明)在代码开始执行之前对其实行函数声明提升(function declaration hoisting),所以在函数声明之前挪用该函数是不会在执行期间报错,但是函数表达式差别,函数表达式用 var 声明,也就是说解析器会对其变量提升,并对其赋值为undefined,然后在执行期间,等到执行到该var 变量的时候再将其变量指向一个function函数,所以在函数表达式之前执行该函数是会报错的。
12
3
4
5
AA();
function (){};
BB();
var BB = function(){};
AA();不会报错,因为是以function的变量提升,BB()会报错,因为是以var的变量提升,提升儿女码等同于如下:
2
3
4
5
6
function (){};
var BB;
AA();
BB();
BB = function(){};
注意: 函数声明提升以后并不会执行内部的代码, 在其内的变量声明也不会起感化, 而是等到函数第一次被挪用时才会执行 如:
2
3
4
5
6
7
var AA = function(){
console.log(' AA ');
}
function BB(){
console.log(' BB ');
}
单独这一段代码并不会起感化, 只有执行:
2
AA(); // 输出 AA
BB(); //输出 BB
function 笼罩
若界说了两个同名的函数,则在预解析期间后面一个会笼罩签名一个
2
3
4
5
6
7
8
9
AA(); // 输出 I am AA_2;
function (){
console.log('I am AA_1');
};
AA(); // 输出 I am AA_2;
function AA(){
console.log('I am AA_2');
}
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30910.html
