在面试JS的面试过程中会出现一类问题专门针对JS的“奇怪现象”去考面试者是否了解关于该语言的边边角角,本文讲的JS上升级至(hoisting)可以算作这一类现象。对于hoisting产生的困户和误解往往是因为其语言在编写(程序员的感知)和实际执行上存在着差异,导致本以为简单明了的执行逻辑出现了意想不到的结果。如果要理解其根本原因,需要了解两个JS engine解析时的两个动作:1.声明(declaration)2. 初始化 (initialization)
var a = "hello world!";
而这两个动作往往靠这一行代码完成,所以常常被认为是一步操作。在实际解析过程中,上图的代码是这样被执行的:
var a; //声明
a = "hello world!"; //初始化
“提升”一词就是形容声明变量的这一步操作,因为它被移到了作用域的顶端。但笔者觉得更贴切的说法应该是:在计算机引解析代码的过程中所有变量的声明永远在初始化之前执行。
console.log(hoist); // 打印 undefined
var hoist = 'Hello World!';
将上图的代码执行,命令行会打印undefined。原因是hoist的声明已被计算机记录在内存中,但是变量尚未初始化,所以打印undefined。但如果去除最后一行,单纯执行console.log(hoist),程序会直接报错并推出。因为解析时未找到任何声明变量名为hoist。