一、所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。
1)var声明的变量在预解析的时候只是提前的声明,
2)function声明的函数在预解析的时候会提前声明并且会同时定义。
二、预解析只发生在当前的作用域下
  程序最开始的时候,只对window下的变量和函数进行预解析GO{}
  只有函数执行的时候才会对函数中的变量和函数进行预解析AO{}
三、当函数执行的时候,首先会形成一个新的私有作用域AO{},然后按照如下的步骤执行。
  如果有形参,先给形参赋值;
  进行私有作用域中的预解析;
  私有作用域中的代码从上到下执行
四、在全局作用域中声明变量带var可以进行预解析,所以在赋值的前面执行不会报错;声明变量的时候不带var的时候,不能进行预解析,所以在赋值的前面执行会报错。
五、注意:JS中,如果在不进行任何特殊处理的情况下,上面的代码报错,下面的代码都不再执行了
六、不管条件是否成立,都会把带var的进行提前的声明
  if (!('num' in window)) {
    var num = 12;
  }
  console.log(num); // undefined
七、只预解析“=”左边的,右边的是指针,不参与预解析
var fn = function () { //不会解析
  console.log('ok');
}
var a = b = 1 //解析的时候只会提升var a 而 b 只是没有声明直接赋值,是全局变量。
八、自执行函数:定义和执行一起完成
  自执行函数定义的那个function在全局作用域下不进行预解析,当代码执行到这个位置的时候,定义和执行一起完成了。
 
九、return以下的代码依然会进行预解析
  return中的代码,都是我们的返回值,所以不进行预解析。
十、typeof(a) //undefined, 未声明而使用变量 只有typeof不报错,是undefined
十一、!!是将表达式强制转化为bool值的运算,运算结果为true或false,表达式是什么值,结果就是对应的bool值,不再取非。
注:
  ①、所有的变量声明,都会提升到最顶部,但不会提升赋值
  ②、所有的函数声明,都会提升到最顶部,但不会提升函数的调用
  ③、如果同时有多个 var 声明的相同的变量,后面的 var 将被忽略
  ④、如果同时有多个同名的函数,后面的函数将会覆盖前面的函数
  ⑤、如果声明的变量和声明的函数同名,声明的函数将会覆盖声明的变量

js之预解析的更多相关文章

  1. js的预解析

    在ES6之前,变量使用var声明,会存在变量的预解析(函数也有预解析).ES6引了let和const,但是现阶段ES6并没有完全普及,而且很多比较老的代码都还是按照ES5的标准甚至是ES3的标准来书写 ...

  2. 两个实例轻松理解js函数预解析

    js函数预解析 例子1: 先上一段代码,看看能不能写出最终的执行结果. console.log(a); var a = 1; console.log(a); function a(){ console ...

  3. 怎样理解JS的预解析机制

    JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...

  4. js的预解析详解

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

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

    一.语言特性         1.预解析:js会把变量的声明(仅仅是声明)提到顶部,但是不会突破作用域.                 alert(a);var a= 12; //结果,undefi ...

  6. js的预解析和作用域

    预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...

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

    JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. 1.编译阶段:又称为预解析阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码. ...

  8. JS函数预解析(小记)

    一,预解析:寻找var  function  形参     a=undefined    fn = function fn(){ alert(); } 二,逐行解读代码:    1.表达式    2. ...

  9. js代码预解析

    1.var一般用于声明变量,预解析代码的时候,等号后面的赋值过程不会执行,所以预解析时的var变量都是未定义的 2.function声明的函数,预解析的时候,值就是函数里面的内容 例:console. ...

随机推荐

  1. CMD窗口恢复默认设置

    CMD全称Command,是Windows系统下自带的类DOS系统,在日常工作中,有时候设置会损害CMD窗口的默认,导致浏览效果不佳,这时候需要有办法恢复到默认设置.在注册表中删除以下文件夹即可:HK ...

  2. NOIP 2002 选数

    洛谷 P1036 选数 洛谷传送门 JDOJ 1297: [NOIP2002]选数 T2 JDOJ传送门 Description ​ 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k< ...

  3. 剑指offer15 二进制中1的个数

    题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1.因此,如果输入9则函数输出2. int Number(int n) { ; while ...

  4. git: hook 修改提交信息

    git获取数字顺序版本号 因为git的版本使用的是hash值,不能很直观的看出那个版本,所以想找到一种方法,获取顺序的版本号,在网上找到了方法,可以获取顺序版本号 摘自:[使用bash从SVN和Git ...

  5. 全球 IPv4 地址正式耗尽

    重要消息: 就在 2019/11/25 UTC+1 15:35 时,一封来自欧洲 RIPE NCC 的邮件中得到确认:全球的IPv4地址已经彻底耗尽. IPv4 大家应该很熟悉了,就是我们平常所知道的 ...

  6. 【Gamma】Scrum Meeting 8

    前言 会议定点:大运村公寓 会议时间:2019/6/7 会议目的:分配任务,准备宣传 一.任务进度 组员 上周任务进度 下阶段任务 大娃 辅助做好引导录屏 优化辅助模型 二娃 撰写会议博客 撰写会议博 ...

  7. 5 系统的软中断CPU升高,一般处理办法?

    还是需要多动手,一个一个问题个被get!

  8. CUDA学习笔记1

    最近要做三维重建就学习一下cuda的一些使用. CUDA并行变成的基本四路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行. CPU和GPU,有各自的存储空间: Host, CPU a ...

  9. Python3+WebSockets实现WebSocket通信

    一.说明 1.1 背景说明 前段时间同事说云平台通信使用了个websocket的东西,今天抽空来看一下具体是怎么个通信过程. 从形式上看,websocket是一个应用层协议,socket是数据链路层. ...

  10. [转帖]k8s 基本使用(上)

    k8s 基本使用(上) https://www.jianshu.com/p/8d60ce1587e1 本文将介绍 k8s 中的一些最基本的命令,并辅以解释一些基本概念来方便理解,也就是说,本文是一篇偏 ...