上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下。

在《你不知道的JavaScript(上卷)》一书的第40页中写到:函数会首先被提升,然后才是变量

书中的一个代码示例是:

foo(); //1
var foo;
function foo() {
console.log(1);
}
foo = function() {
console.log(2);
}

这个例子相对比较好理解,就是foo这个函数会先被声明再作用域的开始部分,实际上这个代码片段会被引擎理解为如下形式:

function foo() {
console.log(1);
}
foo(); //1
foo = function() {
console.log(2);
}

可是,当在网上看到这个一个例子时一开始我也是对运行结果不太理解的:

console.log(foo);    // function foo(){...}
function foo(){
console.log("函数声明");
}
var foo = "变量";

咋一看这段代码输出的应该是undefined啊,因为根据规则是先提升函数,然后才是变量,所以不应该是这样吗?

function foo(){
console.log("函数声明");
}
var foo = undefined;

这个理解最大的一个误区在于变量提升时只是声明了变量,并没有赋值,也就是

var foo;

仅此而已!我们平时在这种声明之前打印变量之所以是undefined是因为只是声明了,其他地方并没有赋值,所以是undefined,像这样的:

console.log(wanc);  //undefined
var wanc = '66';

可是在上面的例子中,变量和函数都是存在的,而且是先提升的函数foo,然后是声明变量var foo;声明变量的过程中并没有改变变量的值,所以最上面打印的还是函数foo;

由此一个小问题引出的思考:有问题就要多查资料,包括网上的和书上的,对比不同人的理解,最终的目的就是要做到知其然并且知其所以然,加油!

参考资料:

最新文章

  1. 使用SqlBulkCopy类来批量复制数据
  2. sql查找最后一个字符匹配
  3. Delphi XE5 android 获取网络状态
  4. C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类
  5. java 开发环境
  6. Windows多线程同步系列之一-----互斥对象
  7. 浅谈iOS程序员的成长和进阶
  8. Python初学基础
  9. ASP.NET Core 运行原理解剖[5]:Authentication
  10. NOIP初赛 之 逻辑运算
  11. EF中关于TransactionScope的使用
  12. 精心收集的 95 个超实用的 JavaScript 代码片段( ES6+ 编写)
  13. appDesign
  14. hikari链接池
  15. eclipse打断点调试进入到class文件中,不显示变量值的解决办法汇总
  16. PYQT实现简单的浏览器功能
  17. 分布式消息队列RocketMQ与Kafka架构上的巨大差异
  18. Python 的 Matplotlib 画图库
  19. Python3基础 三元运算符 简单示例
  20. C#中系统时间和UNIX时间戳互相转换

热门文章

  1. 详解功能版本管理之使用eoLinker
  2. ES6原生Promise的所有方法介绍(附一道应用场景题目)
  3. idea和Webstorm上使用git和github,码云
  4. cocoapods使用 swift注意事项
  5. Mac 终端——常用命令语
  6. Ubuntu上安装flashplayer
  7. Spark源码剖析(五):Master原理与源码剖析(下)
  8. 干货分享!关于APP导航菜单设计你应该了解的一切
  9. window下mysql数据备份
  10. Golang 中的坑 一