浏览器引擎会在解释javascript代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来,包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理,置于作用域前端。
变量声明提升
变量作用域指变量起作用的范围。变量分为全局变量和局部变量。全局变量在全局都拥有定义;而局部变量只能在函数内有效。
在函数体内,同名的局部变量或者参数的优先级会高于全局变量。也就是说,如果函数内存在和全局变量同名的局部变量或者参数,那么全局变量将会被局部变量覆盖。
es6前是没有块级作用域的,通过声明提升变量无论在哪里声明,都会有定义,只有定义没有值是undefined
console.log(a);
var a=1;
console.log(a);
上面函数执行时类似如下过程
var a;
console.log(a);
a=1;
console.log(a);
函数声明提升
函数的创建方式
函数声明
函数表达式
函数声明 function handleClick(){}
函数表达式 var a=function(){}
两种方式不同点 函数声明有有声明的提升,表达式只有定义以后才能使用
下面例子可以看出
console.log(a)
function a(){
console.log(1)
}
var a=function(){
console.log(2)
}
console.log(a);
当函数和变量的声明,前者优先级更高
"use strict";
console.log(a); // fn a
function a (){
}
var a=1;
console.log(a); // a 1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。