变量提升和函数提升

112 阅读1分钟

引擎会在解释JavaScript代码之前首先对齐进行编译,编译过程中的一部分工作就是找到所有的声明,并用合适的作用域将他们关联起来,这也正是词法作用域的核心内容。简单说就是在js代码执行前引擎会先进行预编译,预编译期间会将变量声明与函数声明提升至其对应作用域的最顶端。 如以下代码: var a = true; foo();

var foo = function() { if(a) { var a = 10; } console.log(a); } var b =‘100’

其中,a ,foo ,b会在代码被解析前提升到最高处,并赋值undefined,比如

a = undefined; foo = undefined; b = undefined;

var a = true; foo();

var foo = function() { if(a) { var a = 10; } console.log(a); } var b =‘100’

之后才会解析运行,并且赋值。 函数也是,但是有一个需要注意的细节是函数会首先被提升,然后才是变量。且后面的函数会覆盖前面的函数,如: function foo() { console.log('1'); }

foo();

foo = function() { console.log('2'); } 其结果为两个2,而不是1和2.