JS代码预解析原理

/* JS代码预解析、变量作用域、作用域链等 应该能作为学习JS语言的入门必备知识。下边给出些简要解释和一些典型的代码段,若要了解更多,能从网上搜索到更多相关示例。 引用网上的一段有关 “JS的执行顺序” 的解释:如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),它们的运行顺序是:步骤1. 读入第一个代码段(js执行引擎并非一行一行地执行程序,而是一段一段地分析执行的)步骤2. 做语法分析,有错则报语法错误(比如括号不匹配等),并跳转到步骤5 步骤3. 对var变量和function定义做“预解析”(永远不会报错的,因为只解析正确的声明)步骤4. 执行代码段,有错则报错(比如变量未定义)步骤5. 如果还有下一个代码段,则读入下一个代码段,重复步骤2 步骤6. 结束 */ // 下边给出 三段觉得比较典型的代码示例: /********** 一:基本的几条语句 **********/ alert(num); // undefined var num = 0; alert(str); // 错误:str未定义 str = "string"; alert(func); // undefined var func = function (){ alert(‘exec func‘); } test(); // exec test alert(test()); // 先exec test 后undefined function test(){ alert(‘exec test‘); } /********** 二:函数名与变量名相同 **********/ //var mark = 1; function mark(x) { return x * 2; } var mark; alert(mark); // function mark(x) { return x * 2; } // 去掉前边的var mark = 1;则会返回1 /********** 三:把第二段包括在语句块中 **********/ // 当有条件时候(代码包含在条件语句块里) if (false) { var mark1 = 1; function mark1() { alert("exec mark1"); } //var mark1; alert(mark1); } alert(mark1); mark1(); // 由于解析浏览器解析不同,这段代码在不同浏览器里执行的结果不一致,具体原因可从网上查找答案

时间: 2024-09-30 15:37:03

JS代码预解析原理的相关文章

JS代码预解析原理、函数相关、面向对象

JS重要知识点 这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原理(包括三个段落): 函数相关(包括 函数传参,带参数函数的调用方式,闭包): 面向对象(包括 对象创建.原型链,数据类型的检测,继承). JS代码预解析原理 /****************** JS代码预解析原理 ******************//*JS代码预解析.变量作

1、JS预解析原理(一)

一.作用域概念.预解析规则.表达式 1.作用域概念 什么是作用域:简单说就是作用的范围,指的是函数在哪些范围内可以用,而在其他部分就不可以使用,如果需要使用就需要重新定义. 作用域的作用是什么:用来执行读或者写的操作. 2.预解析规则 script:自上而下进行解析, 函数:由里到外进行解析. 但是浏览器在执行JS代码的时候会分成两部分操作:预解析以及逐行执行代码 预解析:浏览器在开始工作的时候会先解读JS代码的关键字:比如:var function 参数等,并把解析到的内容存入一个类似仓库的地

js的预解析和代码执行相关规则

JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. 1.编译阶段:又称为预解析阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码. 2.执行阶段:在执行阶段JavaScript解释器借助执行环境把字节码生成机械码,并顺序执行. 在未定义和函数中,会选择函数,跟代码顺序没有关系 学习博客:http://www.cnblogs.com/HPNiuYear/archive/2012/08/27/2657879.html

2.2、js基础---预解析和严格模式

一.语言特性 1.预解析:js会把变量的声明(仅仅是声明)提到顶部,但是不会突破作用域. alert(a);var a= 12; //结果,undefined 2.页面无论多长都会进行预解析. 3.js语言执行步骤: 读取一个script标签=>预解析=>执行里面代码=>读取下一个script=>预解析=>执行代码 4.函数也有预解析,但是要注意:当以变量的形式声明的函数,预解析会按照变量的特性走,否则不按照. a();//报错了. var a=function(){ ale

js之预解析

一.所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义. 1)var声明的变量在预解析的时候只是提前的声明, 2)function声明的函数在预解析的时候会提前声明并且会同时定义. 二.预解析只发生在当前的作用域下 程序最开始的时候,只对window下的变量和函数进行预解析GO{}, 只有函数执行的时候才会对函数中的变量和函数进行预解析AO{}. 三.当函数执行的时候,首先会形成一个新的私有作用域

3、预解析原理(三)

上一篇讲到局部变量可以修改全局变量,那么反过来是否可以由外而内的拿到函数内的数据呢?答案是可以的下面就介绍两种方法. 1.通过声明全局变量的方式: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title></title> <script> var str = ''; function fn1 () { var a = '123'; str

JS作用域,浏览器解析原理

---恢复内容开始--- 浏览器: JS解析器:这儿理解为两步1)JS的预解析:“找一些东西”:var function 参数:   (1)所有的变量,在正式运行代码之前,都提前赋一个值:未定义   a=undefined:(2)所有的函数,在正式运行代码之前,都是整个函数块  fn1=function fn1(){alert(2);} 2)逐行解读代码(在第一步形成的仓库的基础上解读)表达式:= + - * / % !++ -- ......逐行读到表达式的时候会改变与预解析中变量的值 注:J

JS作用域概念-预解析规则

// 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var function 参数 a = ... 所有的变量,在正式运行代码之前,都提前赋了一个值:未定义 fn1 = function fn1(){ alert(2); } 所有的函数,在正式运行代码之前,都是整个函数块 JS 的预解析 遇到重名的:只留一个 变量和函数重名了,就只留下函数 2)逐行解读代码: 表达式

JS预解析

1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数 js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个[未定义]的值.而js解析器提取函数是整块提取的读出来,把函数当作整体来看待,也就是说读变量是没值的,读函数是有内容的.这个过程就是js的预解析 所以在逐行读代码的这一步时,解析器每找到一个var声明,就会去看先前提取的东西中有没有它的值(往往是[未定义]) 2.var a=0; var是声明, a=0是表达式 如