块语句中的 var 和 命名式函数会进行预解析。
但块语句中的 命名式函数,不会预赋值,它会在进入块语句后迅速赋值为函数。
<script>
var a = 1;
{
console.log(a); // 1
var a = 2;
}
console.log(a); // 2
var a = 1;
{
console.log(a); // function() {}
function a() {};
}
console.log(a); // function() {}
console.log(a); // undefined
{
function a() {};
}
{
function a() {};
}
console.log(a); // function() {}
var a = 1;
{
console.log(a); // function() {}
a = 3;
console.log(a); // 3
function a() {}
}
</script>
如果块语句中出现变量 和 函数同名时,执行语句块 最后打印的是 正常顺序赋值的 变量 结果。
但是在语句块外,打印的是 是最后一个同名函数上面的 赋值变量结果。
如果语句块中 变量 和 函数名相同时,且只有一个变量和一个函数,
函数在变量前时,最后打印的结果是函数,
变量在函数前时,最后打印的结果是变量
在块语句中,不管有几个同名函数,都会被最后一个同名函数覆盖掉。
由以上特点推断,
如果块语句中出现变量 和 函数同名时,执行语句块 最后打印的是正常顺序赋值的 变量结果。
但是在语句块外,打印的是 最后一个同名函数上面的 变量结果。会忽略掉 最后一个同名函数下面的 变量结果。
<script>
var a = 1;
{
console.log(a); // function
function a() {};
a = 2;
console.log(a); // 2
a = 3;
function a() {}
function a() {}
a = 5;
a = 6;
a = 7;
console.log(a); // 7
}
console.log(a); // 3
var a = 1;
{
function a() {};
a = 3;
console.log(a); // 3
}
console.log(a); // function
var a = 1;
{
a = 3;
function a() {}
console.log(a); // 3
}
console.log(a); // 3
var a = 1;
{
a(); // cc
a = 1;
function a() {
console.log("aa");
}
console.log(a); // 1
function a() {
console.log("bb");
}
a = 2;
console.log(a); // 2
function a() {
console.log("cc");
}
a = 3;
console.log(a); // 3
}
console.log(a); // 2
var a = 1;
if (a < 2) {
a = 3;
function a() {
console.log("aa");
}
a = 2;
}
console.log(a); // 3
var a = 1;
if (a < 2) {
function a() {
console.log("aa");
}
a = 3;
a = 2;
}
console.log(a); // function
</script>