console.log( a );
var a = 2;

执行输出undefined

a = 2;
var a;
console.log( a );

执行输出2

说明:javaScript 运行时在编译器阶段会最先处理var a;也就是变量被提升

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

执行输出undefined,执行foo();时找到了函数的声明,但实际代码写在foo()的后面。说明函数声明会被提升,函数作用域里变量也会被提升

foo();
var foo = function bar() {
console.log(a)
var a =2
};

执行输出TypeError: foo is not a function,说明函数表达式不会被提升,foo() 由于对 undefined进行调用抛出TypeError异常

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

执行输出1,说明虽然函数和变量都能被提升,但是函数声明提升优先于变量声明提升

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

执行输出3,后面的函数声明会覆盖前面的函数声明

总结

var 变量声明和函数声明其实跟javaScript运行原理有关,在javaScript运行之前会先进行编译,在编译阶段会先为变量和函数根据作用域规则开辟内存空间并初始化变量为undefined,而函数是初始化函数变量并且直接赋值函数体,以便在执行的时候方便查找和存储。

let , const到底有没有有变量提升?

console.log(a)
let a=2

输出:ReferenceError: Cannot access 'a' before initialization,表明变量没有被定义,不能在变量为初始化之前使用。其实从这句话看来js是找到了变量a的,但a还没有被初始化;这样看来,let其实也有变量提升(在我理解上来说,提升就是先为变量创造内存空间),js 处理let声明变量的过程:

{
let x = 1
x = 2
}

1、查找let声明的变量x,并在作用域中创建变量,不进行初始化

2、执行代码x=1,初始化为1

3、执行x = 2赋值为2

let 特性

let a=2
let a=3
console.log(a)

输出:SyntaxError: Identifier 'a' has already been declared,不能重复定义变量

参考资料

《你不知道的javaScript 上卷》第四章 变量提升

最新文章

  1. web项目存数据到数据库,中文乱码,解决过程
  2. Linux~centos上安装.netcore,HelloWorld归来!
  3. 谈谈数据监听observable的实现
  4. Hibernate缓存原理与策略 Hibernate缓存原理:
  5. 深度优先搜索 codevs 1031 质数环
  6. AU版有锁机的福利,704越狱彻底解决+86问题,完美IM/FT,重启不掉APN设置
  7. 分享 Java微信开发SDK
  8. ElasticSearch Java api 详解_V1.0
  9. Stage3D学习笔记(五):通过矩阵操作纹理
  10. 【video】m3u8
  11. hud 1312 Red and Black
  12. javascript里的几种常见的数组方法
  13. windows 下文件的高级操作
  14. 教你在不使用框架的情况下也能写出现代化 PHP 代码
  15. Windoes包管理工具(Scoop)
  16. selenium java 浏览器操作
  17. pycharm 报错:pycharm please specify a different SDK name
  18. C语言堆栈的区别
  19. flask-后台布局页面搭建4
  20. js replace

热门文章

  1. mybatis postgresql 批量删除
  2. Edge Chromium 中如何始终允许运行 Flash 内容
  3. Linux_simpl shell-利用Shell脚本for循环输出系统中的用户及其Shell
  4. DK1.5-JDK11各个新特性
  5. Everspin串口串行mram演示软件分析
  6. matlab中的输出显示函数
  7. Linux ps和pstree命令
  8. Mysql连接字符,字段函数concat()
  9. HTML表单概念、语法及创建表单,案例
  10. SP11470 TTM - To the moon[主席树标记永久化]