首先我们来看一段代码:

     <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. FastReport 使用入门

    FastReport  是微软开发的一款快速报表工具,使用起来非常方便简单  最关键的是快捷. 下面介绍一下 Fastreport在项目中的使用. 下图为其中一个效果图 首先 打开FastReport ...

  2. 图遍历算法的应用(包括输出长度为l的路径最短最长路径)

    判断从顶点u到v是否有路径 void ExistPath(AdjGraph* G, int u, int v, bool& has) { int w; ArcNode* p; visit[u] ...

  3. Seconds from winning

    英语沙龙 1. Who winned the game? Answer: It was not Paxton who would hoist the winner's trophy. Paxton h ...

  4. ZJNU 1130 - 龟兔赛跑——中高级

    只需求出乌龟最短耗时跟兔子耗时比即可将起点 0 和终点 N+1 也看做充电站,进行动态规划对第i个点进行动态规划,则可以得到状态转移方程为dp[i] = max{dp[j]+time[i][j]} j ...

  5. windows系统安装msi文件总提示2502、2503的错误

    首先: 1.按WIN+R,在运行框中输入“gpedit.msc” 确认:2.打开本地策略组编辑器后依次展开 :“计算机配置”->“管理模板”->“windows组件”->“windo ...

  6. 《VSTO开发中级教程》刘永富 著 清华大学出版社 在线购买

    现在可以和作者 刘永富 通过“二手书直卖”这个APP直接买书. 二手书直卖 的下载方法: 方法一:加QQ群61840693,群共享中搜索“二手书直卖”,下载后打开即可. 方法二:从本帖下载:二手书直卖 ...

  7. js window.onload 加载多个函数和追加函数

    平时做项目 经常需要使用window.onload, 用法如下: function func(){alert("this is window onload event!");ret ...

  8. ODT(区间覆盖问题)

    解释:先留坑 题目:https://www.cometoj.com/contest/73/problem/D?problem_id=4120 #include<bits/stdc++.h> ...

  9. Java发送邮箱

    smtp与pop3 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器 POP3是Post Office ...

  10. python或pip'不是内部或外部命令”

    Python不是内部外部命令:说明在环境变量中没有添加python的安装文件夹路径 所以我们在path环境变量中添加 E:\python36; Pip不是内部外部命令:说明在环境变量中没有添加pyth ...