- 先有鸡还是先有蛋?什么意思
- 编译器再度来袭?什么意思
- 函数优先?
- 小结?
第一个问题:先有鸡还是先有蛋?
来看代码:
a = 2;
var a;
console.log(a);
// 会输出什么? 2
console.log(a);
var a = 2;
// 会输出什么? undefined
为什么会这么输出呢????
编译器再度来袭。回答第一个问题
先有蛋(声明),再有鸡(赋值);
这个过程就好像变量和函数从他们代码中出现的位置被移动到了最上边,这个过程就叫提升。
注意:
只有声明本书被提升,而赋值或其他运行逻辑会被留在原地。
小结:
- 我们习惯将var a = 2;看作一个声明,而实际上JavaScript引擎并不这么认为,它将var a 和a = 2当作两个单独的声明,第一个是编译阶段的任务,而第二个是执行阶段的任务。
- 这意味着无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。可以将这个过程形象的想象成所有的声明(变量和函数)都会被“移动”到各自作用域的最顶端,这个过程被称为提升。
- 声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。
- 要避免重复声明,特别是当普通的var声明和函数声明混在一起的时候,否则会引起很多危险的问题!
网友评论