test header

一道js变量上浮面试题

function a() {
   var a = 1;
   function b() {
     a = 10;
      return;
      function a() {}
    }
    b();
    log(a); 
}
a(); 

输出结果(下一行,拖动或ctrl+A)

■■■■■■■   输出:   1    ■■■■■■■

 

 

  

 

解析:

昨天去面试,就掉到上浮的坑里,本来是知道这个问题的,但是不太熟练又被迷惑。

最后面试官给我说,变量上浮,是在定义的时候产生的,执行时不存在这个问题。

 

 

来看这个题,a()函数 可以重新这样写

function a(){

  function b()//上浮
    {

    function a(){};//上浮至最高,变量a是函数

    a=10;//变量a又被赋值为10

    return;

    }

  var a;
  
  a=1;
  b();
//执行b(),因为b上浮到顶部,所以先执行了b()中的a=10,然后才执行了上一行的a=1,所以最终结果是1   log(a);   } a();

 

 

_______________________________________________________

(分割线,在这个题的基础上修改一下)

function test() {
    //a()
      return console.log(a,b);
      function a(){console.log(test)}
      var b = 'ssss';
    }
test();

这个里面函数a()和变量b的定义都是在return之后,输出结果是什么?

如果把a()的注释去掉,会得到什么?

 

输出结果: function a()内容和undefined

这说明,在函数执行前(或者说函数执行时),function a()形式的声明,可以提升至作用域顶部,而var就不具备这个作用。

如果把注释去掉,执行a(),则会报错test未定义,说明函数只有在执行时才会检查调用的变量是否存在,可以推想,未执行的函数内部如果有错误也是不会报错的,请看下面这个代码:

function b(){
    asdfasdfasdf
    as
    dfa
    sdf
    asdfasdfasdffas
    dfa
}

不执行b(),是不会出现任何错误的。

 

再看一段代码:

function a() {
   var a = 1;
   function b() {
     console.log(a);
     a = 10;
     console.log(a);
      return;
      function a() {a=5;}
    }
    b();
    console.log(a); 
}

a(); 

 

输出:

function a()

10

1

这是因为return后面的function a()提升至顶部,并在当前函数作用域内声明了一个本地局域变量a,a=10赋值给该局域变量。

 

如果把return后面的function a()注释掉,则输出

1

10

10

这两种输出说明,function a()具有和var a同样的作用,指定了a的作用域为函数体内。修改一下,比如:

function a() {
   var a = 1;
   function b() {
     console.log(a)
     var a  = 10;
     console.log(a)
      return;
    }
    b();
    console.log(a); 
}

a(); 

 

这里b()函数体内的var a=10将变量a的作用域设定在函数体内,a=10的赋值就会在b函数内执行,而不会达到外部的a()函数。等价于:

function a() {
   var a = 1;
   function b() {
    var a;
     console.log(a)
     a  = 10;
     console.log(a)
      return;
    }
    b();
    console.log(a); 
}

a(); 

 

 

好了,看明白上面的内容,再来看餐后甜点:

var foo = 1;

    function Main(){
        console.log(foo);
        var foo = 2;
        console.log(this.foo);
        this.foo = 1;
    }

Main();
new Main();

输出有什么不同? 

posted @ 2016-08-30 15:00  2byte  阅读(239)  评论(0)    收藏  举报