JavaScript预解析

1 预解析

1.1 预解析的基本步骤

在JS引擎执行JS代码会分成三个步骤进行解析代码:

第一步:JS引擎先将JS代码整体按照JS语言的规则进行分词,也就是JS代码的词法分析.

第二步:然后JS引擎浏览JS代码,并对代码进行语法分析,这里只关注代码中变量的声明和函数的声明,这第二步也就叫预解析.

第三步:从上往下,从左到右的执行代码.

第一和第二步都是在执行代码前JS引擎内部执行的过程,尤其是第二步预解析的过程对JS代码的执行顺序有着极其重要的影响.

而对于变量的声明和函数的声明,这两种声明在执行预解析的时候效果也是不同的.

1.2 变量声明的预解析过程

变量的声明是通过关键字var来实现的

.当JS引擎遇到var时会首先在当前作用域中查找是否有声明过这个变量名,如果没有就在当前作用域中添加这个变量,如果有那该次声明就被视为无效.

1.3 函数声明的预解析

函数的声明分为两种:

通过function函数声明的方式声明函数,在预解析的时候,首先在当前作用域中查找是否有声明过这个函数名的变量,如果没有在当前作用域中添加该函数名的变量,如果有则不再重复声明,然后给这个变量进行赋值,赋的值就是这个函数.

但是通过函数字面量方式声明的函数就相当于变量的声明,所以函数字面量声明的情况和变量声明的预解析过程一样.不考虑赋值语句后面的执行.

1.4 预解析的影响

在执行代码前会,预解析过程会在各自作用域中将执行所有声明语句,这样我们就会觉得预解析将声明语句进行了提升.

需要注意的是,声明的变量还是属于各自的作用域,预解析的过程不存在改变变量的作用域.

1.5 词法作用域

词法作用域指的是从代码的可读区域到不可读区域,形成的密闭的独立的内存空间.

在每个词法作用域都会执行一遍新的词法分析,语法分析,执行代码三个JS引擎步骤,并且不影响其他词法作用域.

在JS中函数是一个密闭的独立的内存空间,所以函数就是一个词法作用域.

时间: 2025-01-12 19:56:39

JavaScript预解析的相关文章

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)

hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)! OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解) 一.JS预解析是什么? 其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就

JavaScript 预解析

通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有“预解析”行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正. (1)如果JavaScript仅是运行时自上往下逐句解析的,下面的代码能正确运行是可以理解的,因为我们先定义函数,然后才调用它. 复制代码代码如下: function showM

javascript预解析和作用域

JavaScript解析过程分为两个阶段: 一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码; 二是:执行阶段.在编译阶段JavaScript解析器借助执行环境把字节码生成机械码,并顺序执行; 预解析:在当前的作用域中,js代码执行之前浏览器会默认把所有带var 和function的进行提前的声明或者定义; eg:var num=1; sum(); function sum(){console.log(num)

0143 JavaScript预解析:概念、变量预解析、函数预解析、函数表达式声明函数问题

4.1 预解析的相关概念 JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的. JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析 和 代码执行. 预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义. [提升到当前作用域的最顶部.] 代码执行: 从上到下执行JS语句. 预解析会把变量和函数的声明在代码执行之前执行完成.[声明提前,赋值留在原地.] 4.

javascript预解析详解

1.定义 预解析:在当前作用域下,js运行之前,会把带有var和function关键字声明的变量先声明,并在内存中安排好.然后从上至下解析js语句.而且function的声明优先于var声明. 2.var声明 通过var声明的变量,进行预解析的时候:先声明变量,不管变量有没有赋值,声明时都赋值为undefined. console.log(a); //undefinedvar a = 1;console.log(b); //undefinedvar b = function(){}12345注意

从var func=function 和 function func()区别谈Javascript的预解析机制

var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function xx(){return 5;} } 不会出错,而 { var k = xx(); var xx = function(){return 5;} } 则会出错. 为什么会这样呢?这就要引出javascript中的预解析机制来解释了. JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个

javascript的预解析与变量提升

JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢? 事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有“预解析”行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正. (1)如果JavaScript仅是运行时自上往下

JavaScript的变量预解析特性

JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢?事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,JavaScript有“预解析”行为.理解这一特性是很重要的,不然在实际开发中你可能会遇到很多无从解析的问题,甚至导致程序bug的存在.为了解析这一现象,也作为自己的一次学习总结,本文逐步引导你来认识JavaScript“预解析”,如果我的见解有误,还望指正.池州市贲生工艺品 我们先来看一个例子: var la

javascript解析机制——预解析

JavaScript解析机制是什么? JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. * 编译阶段         编译阶段就是我们常说的JavaScript预解析(预处理)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码. * 执行阶段 在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并顺序执行. 编译阶段(预解析阶段)做什么操作? * var , function声明的变量提升 首先,创建一个当前