JS预解析
来源:互联网 发布:动漫手办淘宝 编辑:程序博客网 时间:2024/05/14 22:04
首先我们先来说一下js的解析顺序。js引擎读取一段js代码,首先会进行预解析,也就是从上往下逐行读取代码,寻找所有的var和function(这个后面会详细解释)。当预解析完成后,js引擎在从第一行开始逐行运行js代码。
JS预解析的定义:
在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,并在内存中安排好。然后再从上到下执行js语句。预解析只会发生在通过var定义的变量和function上。
1.var
通过var关键字定义的变量进行预解析的时候:都是声明declare,不管它有没有赋值,都会赋值undefined。
alert(a); //undefinedvar a = 1;alert(b); //undefinedvar b = function(){}alert(c); //undefinedvar c;
只要是通过var定义的,不管是变量,还是函数,都是先赋值undefined,如果是变量,也不管变量有没有赋值,在预解析阶段,都是会被赋值为undefined,在真正执行的时候才会为它赋值。
2.function
function进行预解析的时候,不仅是声明而且还定义(define)了,但是它存储的数据的那个空间里面存储的是代码是字符串,没有任何意义。
alert(a); //弹出的是下面的functionfunction a(){ alert("预解析function")}
我们知道,定义函数的方式有函数声明和函数表达式两种。解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
alert(sum(10,10));function sum(num1,num2){ return num1+num2;}
以上代码完全可以正确执行,因为在代码开始执行之前,解析器就已经通过一个名为函数声明提升(function declaration hoisting)的过程,读取并将函数声明添加到执行环境中。对代码求值时,JavaScript引擎在第一遍会声明函数并将它们放到源代码树的顶部。所以,即使声明函数的代码在调用它的代码后面,JavaScript引擎也能把函数声明提升到顶部。如果像下面的例子所示,把上面的函数声明改为等价的函数表达式,就会在执行的时候出现错误。
alert(sum(10,10));var sum=function(num1,num2){ return num1+num2;};
以上代码会在运行的时候出现错误,原因在于函数位于一个初始化语句中,而不是一个函数声明。换句话讲,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用。
注: 在JS解析器进行预解析的时候会遵循一个原则,变量声明和函数声明重名的话会优先存储函数声明,与先后顺序无关。
- js的预解析
- js的预解析
- JS之预解析
- js的预解析
- JS预解析
- js预解析介绍
- JS预解析是什么?
- js预解析
- js预解析规则
- JS预解析
- JS代码预解析原理
- JS预解析,作用域
- js预解析的认识
- js 解析
- JS作用域和预解析机制
- 作用域、JS预解析机制
- 考察的是js的预解析
- cocos2d-js 的预加载的js加载解析
- 微软技术大会
- SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)_0
- java模拟点击
- CCF201612-1 中间数(解法二)(100分)
- C陷阱与缺陷--笔记
- JS预解析
- BinarySearch
- VTK修炼之道39:图像平滑_各向异性滤波
- 个人问题备忘
- spring的几个基本注解
- Android 控件学习(极慢更新)
- iOS中谓词的使用(一)
- topcoder SRM 517 div1 AdjacentSwaps 分析与题解
- javascript基础 AJAX简单demo 2017年1月29日