一、声明优先
js 是由上到下一行一行执行的,并不完全正确,考虑以下代码:
a = 2;
var a;
console.log(a);
输入结果是什么? 并不是undefined,输出结果是2
==============
考虑下面这段代码:
console.log(a);
var a = 2;
这段代码你可能认为会抛出异常 ReferenceError ?然而输出的结果是undefined
===============
js引擎有两个步骤,编译和运行,正确的思考是,包括变量和函数在内所有的声明都会在任何代码被执行首先被处理
所以第一个代码段实际上是如下的方式进行处理:
var a;
a = 2;
console.log(a);
第二个代码段实际上是如下流程:
var a;
console.log(a);
a = 2;
==================
函数声明会被提升,但是函数表达式并不会被提升:
foo(); // TypeError异常
var foo = function(){
//dosomething...
}
二、函数优先
函数声明和变量声明都会被提升,但是函数声明会首先被提升,然后是变量声明。如下代码:
foo();
var foo;
function foo(){
console.log(1)
}
foo = function(){
console.log(2);
}
结果会输出1而不是2,js引擎是如下理解这段代码的:
function foo(){
console.log(1);
}
foo();
foo = function(){
console.log(2);
}
注意:var foo 尽管出现在function foo()...的声明之前,但是他是重复的声明,在这里被忽略了,因为函数声明在变量声明之前