作用域:对某个范围产生作用,外部不能访问内部变量,但内部可以访问外部变量
var i = 0 function outer() { console.log(i)//0 }
function outer() { var i = 0 console.log(i)//0 } console.log(i)//报错,外部不可访问内部
变量提升:变量的声明被自动移动到了函数或全局代码的最顶上。函数声明可以写在任何地方,但是不能不写,不写报错
function outer() { console.log(i)//报错,未被声明, } function outer() { console.log(i)//undefined变量提升是把声明提至最前面,即var i但是赋值=0还在原来位置 var i = 0 } function outer() { var i = 0 console.log(i)//0 }
注意:var、function、function *和let、const、class的的提升却并不相同
//声明的函数名和变量一致的情况下,分为两种 //一:函数申明。function foo(){}这种形式,函数优先 console.log(foo)//function foo(){} var foo = 'aa' function foo(){} //二:函数表达式。var foo=function(){}这种形式 console.log(foo)//undefined var foo = 'aa' var foo = function(){}