// 第一种
var a = 1;
function f() {
console.log(a);
}
f() // 1
// 第二种
function f2() {
var a2 = 3;
}
f2();
console.log(a2); // a2 in not defined
// 第三种(记住变量提升,必须声明变量才可以提升)
var a3 = 1;
function f3() {
console.log(a3); // 1
a3 =2;
}
f3()
console.log(a3); //2
// 第四种(全局变量的作用域不会作用于局部的同名变量)
var a4 = 1;
function f4() {
console.log(a4); // 1
var a4 = 2;
}
f4()
console.log(a4); //1
扩展作用域和预解析的结合
// 淘宝的面试题
var a = 10;
function f1() {
var b = 2*a;
var a = 20;
var c = a + 1;
console.log(b);
console.log(c);
}
f1()
// 预解析的过程
/**
* f1() {}
* var a;
* a = 10
* 函数的变量提升
* b
* a
* c
* var b = 2*a = N=aN
* var a = 20;
* var c = 20 + 1 //21
* console.log(b) // NaN
* console.log(c) // 21
*/
预解析(js在执行的时候,分为编译阶段和执行阶段)
// 预解析 (lexical envirmoment )
console.log(a);
var a = 10;
// 预解析的过程
var a;
console.log(a);
a = 10 // 执行阶段
var b = 123;
function b()
// 预解析
var b;
function b() {}
b = 123;
// 测试题
console.log(c); function c() {}
var c =1;
console.log(c); // 1
function c() { // 函数解析
console.log(2);
}
// 解析的过程
function c() { console.log(2)}
var c;
console.log(c); // function
c = 1;
console.log(c); // 1