{
console.log(a); // undefined
var a;
console.log(a); // undefined
a = 1;
console.log(a); // 1
var a;
console.log(a); // 1
}
{
function a() {
console.log('2', a); // a(){}
a = 1;
console.log('3', a); // 1
}
console.log('1', a); // a(){}
a();
console.log('4', a); // 1
a(); // error, not a function
}
/**
* 注意case1,2,3的异同
*/
// case: 1
{
var a = 1;
// 函数表达式后面的函数名是可选的
// 如果有函数名,函数名是函数体的本地变量, 且赋值无效
(function a() {
console.log('1', a); // a(){}
a = 2;
console.log('2', a); // a(){}
})();
console.log('3', a); // 1
}
// case: 2
{
var a = 1;
{
var func;
// 函数表达式后面的函数名是可选的
// 如果有函数名,函数名是函数体的本地变量, 且赋值无效
func = function a() {
console.log('1', a); // a(){}
a = 2;
console.log('2', a); // a(){}
}
func();
console.log('3', a); // 1;
}
console.log('4', a); // 1
}
// case: 3
{
var a = 1;
{
// 块级作用域中的函数声明类似var
function a() {
console.log('1', a); // a(){}
a = 2;
console.log('2', a); // 2
}
var func = a;
func();
}
console.log('3', a); // a(){}
}