1.变量提升
无论实际声明的位置在何处,都会把变量的声明提升到函数或全局作用域的顶部(而赋值操作还是在原先的位置)
2.变量作用域
在ES5中,js只有两种形式的作用域:全局作用域和函数作用域
1.全局作用域其实是全局对象的作用域,任意地方都可以访问到
2.函数内可以访问函数外的变量,而函数外无法访问函数内的变量
var age = 18; //全局变量,全局作用域
function outer() { //外部函数
console.log(age, 1); // 内部的age会进行变量提升, undefined
var age = 23;
function inner() { //内部函数
console.log(age, 2); //23
}
inner();
}
outer();
console.log(age, 3); //18
var name = "World!";
function fun() {
console.log(name); //函数内的var进行变量提升 undefined
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
}
fun();
3.案例
//函数作用域内的变量外部是无法访问的
function foo() {
// 函数作用域内var会使变量提升到函数最顶部
var name = 'nick'
}
foo()
console.log(name) //会报错
// 函数内声明相同的变量
var name = 'nick';
function foo() {
var name = 'nancy';
console.log(name);
}
foo(); // => 'nancy'
console.log(name); // => 'nick'
//在控制语句内声明的变量,在控制语句外面也可以使用
if (true) {
var a = 1
}
for (var i = 1; i < 10; i++) { }
console.log(a, i); // => 1 10
// 在控制语句内声明一个与外部同名的变量。
var b = 1;
if (true) {
var b = 10; // 与外部 x 变量同名
}
console.log(b); // => 10