当前位置:首页 > Web开发 > 正文

但是并不会被提升

2024-03-31 Web开发

文章目錄

解析机制

JavaScript是一门解释型的语言 , 想要运行js代码需要两个阶段

编译阶段: 编译阶段就是我们常说的JavaScript预解析(预措置惩罚惩罚)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码

执行阶段: 在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并从上到下按挨次执行

预解析时做什么var , function声明的变量提升

  首先,,创建一个当前执行环境下的勾当东西,然后将用 var 声明的变量设置为勾当东西的属性(也就是将其添加到勾当东西傍边)并将其赋值为undefined,然后将 function 界说的函数 也添加到勾当东西傍边

1
2
3
4
5
6
7
  if( false ){
var aa = 20;
var bb = 30;
}

function (){};
function BB(){};
 

var界说的aa,bb以及function界说的AA(),BB()城市被变量提升到window东西下面 提升后等同于如下代码:

1
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函数,所以在函数表达式之前执行该函数是会报错的。

1
2
3
4
5
  AA();
function (){};

BB();
var BB = function(){};
 

AA();不会报错,因为是以function的变量提升,BB()会报错,因为是以var的变量提升,提升儿女码等同于如下:

1
2
3
4
5
6
  function (){};
var BB;

AA();
BB();
BB = function(){};
 

注意: 函数声明提升以后并不会执行内部的代码, 在其内的变量声明也不会起感化, 而是等到函数第一次被挪用时才会执行 如:

1
2
3
4
5
6
7
  var AA = function(){
console.log(' AA ');
}

function BB(){
console.log(' BB ');
}
 

单独这一段代码并不会起感化, 只有执行:

1
2
  AA(); // 输出 AA
BB(); //输出 BB
 
function 笼罩

 若界说了两个同名的函数,则在预解析期间后面一个会笼罩签名一个

大专栏  js感化域其二:预解析ass="gutter">1
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