hey,guys!我们一起总结一下JS预解析吧!

首先,我们得搞清楚JS预解析和JS逐行执行的关系。其实它们两并不冲突,一个例子轻松理解它们的关系:

你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解析),但吃的时候还是一口一口的吃(JS逐行执行)!

OK,解决下面五个问题,JS预解析就算过了~~(前提:对JS变量作用域有清晰理解)

一、JS预解析是什么?

其实就是对程序要用到的材料(变量,函数)给一个初始值,并存到一个表中(我自己虚构的),当程序运行到那一行时,就来这个表看有没有初始值,没有就报错~~

二、JS在什么情况下会进行预解析呢?

1.遇到<script></script>标签对时;

2.遇到函数时;(因为变量是有作用域的)

三、JS对什么进行预解析?

1.var 后面的变量

2.函数 

3.函数传参的变量

四、那JS会给这些 变量、函数 赋予什么初始值呢?

1.凡是var 的,都会赋予一个 undefined 作为初始值;

2.凡是函数,直接赋予 函数本身 作为初始值;(所以这就是为什么我们可以把 函数调用 放到  函数声明 之前的原因)

五、什么情况会改变 预解析 赋予的初始值呢?

有赋值功能的符号:=,  +=,  -=,  *=,  /=,  ++,  --等 (如果还有再添加..)

下面是来点实例:

alert(a);    //报错,没有var 是不会进行预解析的
a = 0;
alert(a);    //undefined
var a = 0;
alert(a);    //0, =号 可以改变初始值
alert(a);    //function a(){ alert('我是函数') },  undefined代表空,函数不是空的,当然要不是空的啦!
var a = '我是变量';
function a(){ alert('我是函数') }
alert(a);    //'我是变量', = 可以改变初始值
alert(a);    //function a(){ alert('我是函数') },  undefined代表空,函数不是空的,当然要不是空的啦!
a++;
alert(a);    //NaN, ++可以改变初始值
var a = '我是变量';
function a(){ alert('我是函数') }
alert(a)    //'我是变量', = 可以改变初始值
alert(a);    //undefined
var a = 0;
alert(a);    //0
function fn(){alert(a);    //undefined;遇到函数,重新进行预解析var a = 2;alert(a);    //2
}
fn()
alert(a);    //0,fn里面的a与全局的a不是同一作用域的
alert(a);    //undefined
var a = 0;
alert(a);    //0
function fn(){alert(a);    //0;因为没var, 所以这里的a会被看作是全局的,往上查找,找到a=0,所以是0,如果全局也没有就会报错a = 2;alert(a);    //2
}
fn()
alert(a);    //2,fn把这全局的a修改了
function fn(a){alert(a);    //undefined,JS会把传参当作var一样对待,相当于在fn内部定义了一个变量--> var a;a = 2;alert(a);    //2,这里修改的不是全局的哦,改的是fn的局部变量哦
}
fn()
alert(a);    //报错
<script>
alert(a);    //报错,因为遇到<script>标签对时,会先对这一块进行预解析,运行到下面的才会再进行预解析,下面没预解析,所以找不到a,于是报错了
</script><script>
alert(a);    //undefined
var a = 0;
alert(a);    //0
</script>
<script>
var a;
</script><script>
alert(a);    //undefined,虽然这个<script>标签对没有定义a,但会往上查找,上面的个<script>标签定义了,所以为undefined
</script>
下面我们再看下这两种情况的区别: 
alert(a);    //function a(){ alert('我是函数') }
function a(){ alert('我是函数') }
alert(a);    //undefined,可以看出,凡是var,初始值都是undefined
var a = function (){ '我是函数' }

看,JS预解析也就这样,没我们想象中的那么难吧!

欢迎拍砖,觉得好的请点下推荐~~

之前还有一个地方不够严谨,补充一下(2014.06.08):

对于函数内的预解析,可以理解成在执行前一瞬间进行预解析,然后才执行。

对于参数的预解析,传参前,直接赋值undefined,传参后,就是传参的值;

所以在函数内的预解析  参数 是最先被解析到的。

function a(b){alert(b);function b(){alert(b);}b();}a(1);  //b函数, b函数
function a(b){alert(b);function b(){alert(b);}b();}a(c);  //b函数,  b函数function c(){return 123; }

轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)相关推荐

  1. JavaScript 预解析机制

    JavaScript预解析 文章目录 JavaScript预解析 JS预解析? 一.预解析受体 二.对var的预解析 三.对function的预解析 四.var在作用域内 五.function作参.在 ...

  2. 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )

    变量:  存储数据的容器 1.声明        var 2.作用域全局变量. 局部变量. 闭包(相对的全局变量): 3.类型a.基本类型(undefined, null, boolean, numb ...

  3. JavaScript(三)—— JavaScript 函数/JavaScript 作用域/JavaScript 预解析/JavaScript 对象

    本篇为 JavaScript 系列笔记第三篇,将陆续更新 JavaScript(一)-- 初识JavaScript/注释/输入输出语句/变量/数据类型 JavaScript(二)-- JavaScri ...

  4. JavaScript 预解析、对象、错误

    单线程 记住一句话:JavaScript语言是单线程的 区分线程和进程 进程是一个工厂,工厂有它的独立资源-工厂之间相互独立-线程是工厂中的工人,多个工人协作完成任务-工厂内有一个或多个工人-工人之间 ...

  5. JavaScript预解析、作用域题目记录

    JavaScript预解析.作用域题目记录 写出以下题目执行的结果及过程分析 function fun ( n ) {console.log( n );var n = 456;console.log( ...

  6. Javascript预解析、作用域、作用域链

    最近在看js的一些资料,总结一下昨晚看到的js作用域方面的知识,不准确的地方希望留言指正! 先看片段js代码如下: 1 < script type="text/javascript&q ...

  7. Javascript预解析、代码执行

    1.js引擎分为两部 :预解析 代码执行 预解析js引擎会把 js 里面所有的 var 还有 function 提升到当前作用域的最前面 代码执行 按照代码书写的顺序从上往下执行 2.预解析分为 变量 ...

  8. JavaScript ( 预解析 )

    <script> // 预解析:教如何看懂代码的执行过程 // js的执行过程: /* 1.解析 - 预解析 2.执行 - 然后,代码按照预解析的结果顺序执行 */ // 预解析具体在做什 ...

  9. JavaScript预解析详解

    JS预解析 JS解析器在运行JS代码时分两步: 预解析和代码执行 预解析 JS引擎会把JS里面所有 var 和 function 提升到当前作用域的最前面 代码执行时, 按照代码书写的顺序从上往下执行 ...

最新文章

  1. 仿联想商城laravel实战---7、lavarel中如何给用户发送邮件
  2. 【译】Private AI — Federated Learning with PySyft and PyTorch
  3. Sass学习笔记(一)
  4. 光纤铜缆测试安装的基础知识你都了解了吗?
  5. 转: seajs手册与文档之 -- 模块标识
  6. guido python正式发布年份_Python语言适合哪些领域的计算问题? (1.3分)_学小易找答案...
  7. python中的return和print的区别_python中return和print的区别(详细)
  8. Python中的openpyxl如何对excel修改文件
  9. 【Unity】关于屏幕自适应的思路
  10. ArcGIS Portal 10.4 本地坐标系的web 3d地形展示制作说明
  11. JAVA映射文件到内存,java之内存映射文件
  12. 计算机磁盘文件怎么加密,怎么加密磁盘-文件夹加密超级大师加密磁盘的方法 - 河东软件园...
  13. 全球及中国石头纸行业发展动态与投资现状分析报告2022版
  14. packages are looking for funding run `npm fund` for details ( npm 支持开发者添加募款链接)
  15. 常见算法:c语言矩阵算法问题
  16. cogs 944. [東方S3] 藤原妹红
  17. linux程序间管道通信,linux进程间通信——管道 详解
  18. 中国十大金牌游戏策划
  19. matlab绘图操作之坐标轴范围设置
  20. 苹果x怎么关机_苹果12怎么关机 iPhone12关机方法汇总

热门文章

  1. 如何实施有效的奖励,增进个人和团队的尽职度
  2. python2 输出不换行_怎样使 Python 输出时不换行
  3. 如何在linux上配置网桥
  4. 新浪level2股票接口有哪些类型?
  5. 用bat制作“假勒索”整蛊同事
  6. dodon ***X-NG-R8
  7. java 文字互换_Java简繁体中文互换
  8. win7设置3D桌面效果
  9. 【3DSlicer】基于心脏ct影像重建3d模型及导出
  10. Acwing《算法基础课》第3章 搜索与图论