showName()
console.log(myname)
var myname = 'hhh'
function showName() {console.log('函数showName被执行');
}
按照JavaScript 是按顺序执行的逻辑来理解的话,当执行到第 1 行的时候,由于函数 showName 还没有定义,所以执行应该会报错;同样执行第 2 行的时候,由于变量 myname 也未定义,所以同样也会报错。
而事实上,第 1 行输出“函数 showName 被执行”,第 2 行输出“undefined”,这和前面想象中的顺序执行有点不一样啊!
如果没有定义变量或函数,代码还能继续执行吗,试一下,显然不能会报错;因此得出一下结论:
1、在执行过程中,若使用了未声明的变量,那么 JavaScript 执行会报错。
2、在一个变量定义之前使用它,不会出错,但是该变量的值会为 undefined,而不是定义时的值。
3、在一个函数定义之前使用它,不会出错,且函数能正确执行。
这就是JS中的变量提升:所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分和函数的声明部分提升到代码开头的“行为”。变量被提升后,会给变量设置默认值,这个默认值就是我们熟悉的 undefined。从概念的字面意义上来看,“变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,正如我们所模拟的那样。但,这并不准确。实际上变量和函数声明在代码里的位置是不会改变的,而且是在编译阶段被 JavaScript 引擎放入内存中。一段 JavaScript 代码在执行之前需要被 JavaScript 引擎编译,编译完成之后,才会进入执行阶段。
总结:
JavaScript 代码执行过程中,需要先做变量提升,而之所以需要实现变量提升,是因为 JavaScript 代码在执行之前需要先编译。
在编译阶段,变量和函数会被存放到变量环境中,变量的默认值会被设置为 undefined;在代码执行阶段,JavaScript 引擎会从变量环境中去查找自定义的变量和函数。
如果在编译阶段,存在两个相同的函数,那么最终存放在变量环境中的是最后定义的那个,这是因为后定义的会覆盖掉之前定义的。