变量提升变态面试题

434 阅读1分钟

遇到块级作用域:

  • 老版本浏览器下:

    变量提升: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