首先我们来看一段代码:

     <script>
console.log(a);
var a = 10;
</script>

此时运行结果为  

为什么会显示undefined呢?这就涉及到了预解析中的变量提升:

1、局部提升(变量)  会把变量声明分成两部分

      1) 变量声明  只有这个部分发生了提升,提升至所在作用域的最前面

      2) 变量赋值  在原位置;


接下来再看一段代码:

    <script>
foo();
function foo(){
console.log("hello world");
}
</script>

此时运行结果为:

我们会发现,声明式的函数,调用在声明之前也是可以访问的。这是因为预解析总的函数提升:

2、整体提升(函数)  

整个函数都提升到作用域的最前面

          


了解了变量提升和函数提升,那么我们来想一下两者谁的优先级更高?

    <script>
console.log(foo);
var foo = 10;
function foo(){}
</script>

显示结果为:结果得到函数而不是变量;

也就是说:函数将变量声明覆盖,说明是先变量提升之后,函数再提升上去将其覆盖。所以,变量提升的优先级高。


总结:

JavaScript 预解析机制  有如下操作:

  1. 检查你的所有代码有没有语法错误。如果有语法错误,直接终止程序;
  2. 声明提升:把所有需要和内存交互的行为提前,将所有的内存操作集中在一起提升代码效率。分为局部提升和整体提升2种方式。

并且,声明提升中,局部优先提升,然后整体提升。


声明提升也解释了为什么赋值式的函数 调用在声明前会报错

         // 2.报错  类型错误
foo();
var foo = function(){
console.log("hello");
}
// 可以调用
// foo();

因为此时为局部提升,先只在内存中定义了 var foo,此时它仍为undefined


以下是一个相关例子

     <script>
foo();
console.log(b); //可以打印,因为b作用域为全局作用域window
console.log(c);
console.log(a); //不可访问 function foo(){
var a = 10; //局部变量, var a 解析到函数(作用域)最前面
b = c = 7; //变量没有声明,直接赋值变为伪全局变量
console.log(a);
console.log(b);
console.log(c);
}
</script>

JavaScript 预解析机制的更多相关文章

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

    hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...

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

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

  3. 从var func=function 和 function func()区别谈Javascript的预解析机制

    var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function ...

  4. 进击JavaScript核心 --- (2)函数和预解析机制

    一.函数 每个函数都是 Function类型的实例,也具有属性和方法.由于函数也是一个对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 1.函数的定义方式 (1).函数声明 fun ...

  5. javascript预解析和作用域

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

  6. JavaScript预解析

    定义:JavaScript"预解析",可以理解为把变量或函数预先解析到它们被使用的环境中. 通俗点讲,即认为浏览器在正式运行JavaScript代码前, 第一步,会预先根据关键字v ...

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

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

  8. javascript 预解析

    内容来源:http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html JavaScript中,你可以在函数的任何位置声明多个var语句,并 ...

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

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

随机推荐

  1. 数字格式化NumberFormat

    做财务的同学遇到逗号分隔的数值格式,会用到NumberFormat类格式化数据 BigDecimal bigDecimal = new BigDecimal("1000000000.4110 ...

  2. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十一天】(购物车+订单)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  3. rare alleles

    I.4 Where the rare alleles are found p是基因A的频率,N是个体数目(也就是基因型个数,所以基因个数是2n,所以全部个体的基因A的个数是2np),p方是PAA,np ...

  4. 28)PHP,数据库连接类

    PHP代码展示: <?php //类名,也习惯上(推荐)使用跟文件名相似的名字 //定义一个类,该类可以连接mysql数据库 //并连接后返回资源(或失败就终止) class mysqlDB{ ...

  5. VMware 三种网络配置解释

    https://blog.csdn.net/noob_f/article/details/51099040 ifconfig -a 网卡名称

  6. Box and Ball

    题目描述 We have N boxes, numbered 1 through N. At first, box 1 contains one red ball, and each of the o ...

  7. Windows电脑忘记密码

    1.重启电脑,开机后按F8进入高级选项,选择<命令提示符的安全模式>并回车 2.出现administrator的登录画面后直接回车,此时便进入了命令行窗口 3.下面就是简单粗暴的一行命令搞 ...

  8. QuickSort(快速排序)原理及C++代码实现

    快速排序可以说是最重要的排序,其中延伸的思想和技巧非常值得我们学习. 快速排序也使用了分治的思想,原理如下: 分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r ...

  9. Linux系统使用IBMV3700存储(可用)

    第一步:在存储上添加主机,主机采用ISCSI连接,此时需要主机的iqn 主机上获取IQN的命令如下: cat /etc/iscsi/initiatorname.iscsi 此时添加的主机状态处于脱机的 ...

  10. Introduction to Computer Science and Programming in Python--MIT

    学习总结--(Introduction to Computer Science and Programming in Python--MIT) 导论 主题 重新利用数据结构来表达知识 理解算法的复杂性 ...