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. 区分一下dpkg,rpm和yum以及apt-get

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系):U ...

  2. C语言中的const

    今天探讨const,首先来说是将变量常量化.为什么要将变量常量化,原因有诸多好处有诸多.比如可以使数据更加安全不会被修改! 但是这个词有几个点要注意,那就是他究竟修饰了谁? 1.const int a ...

  3. nginx配置404

    1.创建一个404错误时显示的页面 2.在nginx.conf中的http区域加入: fastcgi_intercept_errors on; 3.在nginx.conf的server区域(如果网站有 ...

  4. Application 应用程序对象使用介绍

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DemoApplicatio ...

  5. celery入门

    认识 这里有几个概念,task.worker.broker.顾名思义,task 就是老板交给你的各种任务,worker 就是你手下干活的人员. 那什么是 Broker 呢? 老板给你下发任务时,你需要 ...

  6. 4、Type fundamentals

    1.All Types Are Derived from System.Object The CLR requires all objects to be created using the new ...

  7. NPOI利用多任务模式分批写入多个Excel

    接上文NPOI大数据分批写入同个Excel,这次是利用task多任务同时写入到多个Excel. Form2.cs private void btnExport_Click(object sender, ...

  8. 6.mybatis异常:SQL Mapper Configuration,Error parsing Mapper XML,Could not resolve type alias

    在xxxMapper中 <select id="getClazz" parameterType="int" resultType="getCla ...

  9. Kazam: a perfect srceen recorder in Linux/Ubuntu

    Kazam provides a well designed and easy to use interface for capturing screencasts and screenshots. ...

  10. 《FLASH CC 2015 CANVAS 中文教程》——3、this关键字 入门

    注::如果你对 FLASH 这个软件操作不够熟悉,建议你可以先看看FLASH动画之类的书. :FLASH CC 在文中直接简称为CC. :以下所以文章中所说的快捷键 如果你按了不起作用,请检查是否有其 ...