1.变量提升
console.log(a);//undefined
var a=123;
因为变量a的声明被提到了作用域顶端。代码编译后应该是下面这个样子(只是声明的a提升上去了,赋值并没有提升到顶端)
在代码中 使用 var 来声明变量的时候,会提到当前作用域的顶端,而赋值操作在原处不变
var a;
console.log(a)
a=123//所以输出内容为 undefined
解析:
1.第一个打印出undefined是因为变量提升,当前的v1只是声明了并没有赋值
2.第二个打印undefined是因为var的变量声明只是提升到当前作用域的顶端,foo函数体的v1跟第一个打印一样,只是提升没有赋值
3.第三个打印是因为var重复声明并且内层变量会覆盖外层变量,当前的v1已经被修改
4.第四个打印是因为函数内部的变量外部是访问不到的,当前的v1是100
2.函数提升
具名函数的声明有两种方式:1. 函数声明式 2.
变量形式声明
//函数声明式 function bar () { }
//变量形式声明; var foo = function () {}
注意:
bar()
var bar=function(){console.log(2);}// 报错:TypeError: bar is not a function
变量形式声明 的函数 和普通变量一样 提升的 只是一个没有值的变量,所以执行bar的时候函数体还在底下没有赋值
bar()
functionbar(){console.log(1);}//输出结果1
函数声明式会提升到作用域最前边,并且将声明内容一起提升到最上边。,所以执行bar的时候它已经是一个函数体了
函数声明的优先级高于变量声明的优先级,并且函数声明和函数定义的部分一起被提升,所以会先打印一个1然后才打印2