1.在逐行读js代码前,解析器会先提取所有声明的var变量和函数

js解析器会先把脚本里所有var变量声明读一遍,但是它只读变量名字,不读变量值,一开始它会赋给所有读到的var变量一个【未定义】的值。而js解析器提取函数是整块提取的读出来,把函数当作整体来看待,也就是说读变量是没值的,读函数是有内容的。这个过程就是js的预解析

所以在逐行读代码的这一步时,解析器每找到一个var声明,就会去看先前提取的东西中有没有它的值(往往是【未定义】)

2.var a=0;

var是声明, a=0是表达式

如果你只写了a=0时,预解析就不会提取a,那么当后面你要用到a时,解析器去仓库中没有找到a,就会报错,而不是告诉你“a的值是未定义”;

3.预解析时有一条重要原则,当函数命名冲突了(重名),解析器会【“留下函数,丢掉变量,无关函数声明和变量声明的顺序”】,也就是哪怕先声明的函数a,后声明的变量a,预解析仓库中存的a的值也是函数值而非 未定义(变量的值)。

4.【表达式】

带有= + - * /  这样“可以改变值的符号的”才叫表达式,一个单纯函数的声明是不会改变任何值的(没有表达式),所以看下面例子

在这个图中,当解析器执行到第二部“逐行读代码”时,第39行的声明并没有改变预解析仓库中的值,因为它不是表达式。

5.作用域上的问题

(1) 局部变量可以拿到全局变量的值,但是全局变量没法拿到局部变量的值,比如你可以在函数内给一个变量赋全局变量的值,但是你不能在函数外给一个全局变量赋一个函数内声明的变量的值;

所以我们要全局变量能拿到局部变量的值的方法就是,先声明一个全局变量,然后【在函数内】,把某个局部变量的值赋给它,就拿到了

(2)  函数内部形成了一个作用域,但是同样具有大括号的if语句和for语句,它们的大括号内并不形成作用域,在其中声明变量仍然是全局的

6.一个一直没有注意到的问题

for(i=0;i<3;i++){alert(i)};  //会弹出0,1,2  没有问题        但是这时的i=3    而不是i=2

猜测原因,当弹出0这个动作完了之后,i就变成了1。(i++是先执行后增加的),当弹出2后,i就变成了3。    它执行了三遍, ++了三遍,怎么可能i不达到3    只是因为没显示出来而已;

未完待续

JS预解析的更多相关文章

  1. js预解析相关知识总结以及一些好玩的面试题

    js预解析的题像在做智力题一样有意思~ 预解析 预解析:在解释这行代码之前发生的事情——变量的声明提前了,函数的声明提前 console.log(num) ——未定义Num,结果是报错 var num ...

  2. js预解析及特效

    预解析: // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var ...

  3. js预解析问题总结

    //示例 1 alert(a) // undefind. alert(fn) // function 整个函数块. var a = 1; function fn(){ return falss; }; ...

  4. [妙味JS基础]第六课:作用域、JS预解析机制

    知识点总结 浏览器的解析方法 script 全局变量,全局函数 自上而下 函数 由里到外 "JS的解析器": 1)“找一些东西”:var function 参数 var a=未定义 ...

  5. javascript . 03 函数定义、函数参数(形参、实参)、函数的返回值、冒泡函数、函数的加载、局部变量与全局变量、隐式全局变量、JS预解析、是否是质数、斐波那契数列

    1.1 知识点 函数:就是可以重复执行的代码块 2.  组成:参数,功能,返回值 为什么要用函数,因为一部分代码使用次数会很多,所以封装起来, 需要的时候调用 函数不调用,自己不会执行 同名函数会覆盖 ...

  6. JS预解析机制

    JS的预解析过程: 1,预解析 2,再逐行解读代码, 实例: ---------------------------- <script>        var name="xm& ...

  7. js 预解析

    前言 JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢? 事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了 ...

  8. js---07 js预解析,作用域---闭包

    js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等 ...

  9. js 预解析以及变量的提升

    js在执行之前会进行预解析. 什么叫预解析? 预:提前 解析:编译 预解析通俗的说:js在执行代码之前会读取js代码,会将变量声明提前. 变量声明包含什么?1.var 声明 2.函数的显示声明. 提前 ...

随机推荐

  1. Swift 动画学习笔记

    视频地址: http://www.swiftv.cn/course/i275v5lz 1,动画属性 position(位置),opacity(透明度,0 全透明,1 不透明),Scale(尺寸),Co ...

  2. 【leetcode❤python】 112. Path Sum

    #-*- coding: UTF-8 -*-# Definition for a binary tree node.# class TreeNode(object):#     def __init_ ...

  3. iOS开发Extra系列:NSString***

    在iOS系统,NSString可能是最常用的对象,很多用法跟其他语言不一样. 字符串对象NSString 使用格式创建字符串 1 2 3 4 5 + (id)stringWithFormat:(NSS ...

  4. js将数组元素随机排序的方法

    在群里看见的一个面试题,试了一下,还是可以做出来的,但是需要查资料,主要是岁一些方法了解的不清楚,可能这个跟我平时不太注重基础理论有关系,像什么构造函数啊,我根本就不关心什么叫构造函数,我一直都以为我 ...

  5. div模拟表格使用display

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. 移除virbr0

    在我们使用虚拟机管理器的图形界面来安装虚拟机的时候,自动创建虚拟网桥和虚拟网卡.另外,我们很少会在一个虚拟机中再安装一个虚拟机,所以,我们可以将宿主机上的网桥删除.方法如下: # virsh net- ...

  7. 读取excel到数据库里面

    //读取excel数据到dataTable里面 public DataTable ReadExcelDataToDataTable(string path) { DataTable dt = new ...

  8. linux 中 ll 命令如何让查询结果按时间升序或降序排序?

    -t选项的功能是使输出的结果将以时间降序排列.如果希望按时间的升序排列,可以使用管道符将返回的结果传入tac命令.用法示例:查询当前目录的文件并以降序排列: ll -t查询当前目录的文件并以升序排列: ...

  9. @RequestMapping测试各种访问方式

    这里访问WEB-INF目录下的页面,这个还不知道有没有类似struts2那样的通配符来可以访问不同的action,不同的method,不同 的页面,用户则很爽,有的话求告知,而且我还有一个问题就是配置 ...

  10. [HDOJ5952]Counting Cliques(DFS,剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5952 题意:求图中规模为s的团的个数. DFS+剪枝,姿势不好很容易TLE啊. #include &l ...