js-变量提升

函数作用域和声明提前

  这是一个例子,刚开始看的时候,觉得自己一眼就知道怎么回事,自己敲了之后发现,结果并不是那样。或许其他的小伙伴们也会遇到这样的问题吧。

1
2
3
4
5
6
7
  var a ='123';
  f();
  function f (){
    alert(a);
    var a = '456';
    alert(a);
  }

  结果会是什么呢?可能很多小伙伴都会认为,第一次弹出 123,第二次弹出456.当然如果答案是这样的话,写这个就没必要了。大家不妨自己去敲一下代码就知道了。
  答案:
    第一次弹出undefined,第二次弹出456.
    对于跟我一样js不好的小伙伴是否会大吃一惊呢?
    js权威指南上是这样解释的:由于函数作用域的特性,局部变量在整个函数体始终是有定义的,也就是说,在函数体内局部变量遮盖了同名全局变量。尽管如此,只有在程序执行到var 语句的时候,局部变量才会被真正赋值。上述过程等价于

1
2
3
4
5
6
7
    f();
    function f (){
      var a;
      alert(a);
      a = '456';
      alert(a);
    }

    我相信这样小伙伴们就应该能清楚的知道了。也问过其他的大神们,他们给出一个名词,变量提升。从字面上大致也可以理解,可能这样说更简单,更加的通俗易懂。