遇到块级作用域:
-
老版本浏览器下:
变量提升:foo = 0x0001; [[scope]]:EC(G) -
新版本浏览器
全局变量提升的时候,出现在{}中的(排除对象和函数等)的function,只声明不定义
1题
{
function foo() {}
foo = 1;
}
console.log(foo);
//我们可以debugger分析一下
debugger;
console.log(foo); //首先是undefined,因为变量没有赋值,只是提前声明
{
//在块级作用域内部提前声明+赋值
console.log(foo); //function foo() {}
function foo() {}
foo = 1; //foo===>1
console.log(foo); //私有的输出1 ;当执行到这行的时候,会把之前所有的对foo的操作同步给全局的foo一份
}
console.log(foo); //全局的foo是函数 function foo() {}
2题
//全局声明了变量foo
{
//私有的块级作用域foo提前声明+定义 ==>function foo() {}
function foo() {} //遇到这,将之前所有对foo的操作同步给全局一份 全局foo==>0x0002(就是0x0002)
foo = 1; //变为1
function foo() {} //遇到这,将之前所有对foo的操作同步给全局一份 全局foo==>1
}
console.log(foo); //1
同上分析
3题
{
function foo() {}
foo = 1;
function foo() {}
foo = 2;
}
console.log(foo);
分析:略
4题
var a = 0;
if (true) {
a = 1;
function a() {};
a = 21;
console.log(a)
}
console.log(a);
// 全局声明 a:undefined
var a = 0; //a==>0
if (true) {
//块级作用域a提前声明+定义 a==> function a() {};
a = 1; //赋值 1
function a() {}; //遇到这行,将之前对a的所有操作同步一份给全局的a
a = 21; //私有的a==>21
console.log(a) //21
}
console.log(a); //-->1