zoukankan      html  css  js  c++  java
  • Javascript变量提升解释

    声明提升解释

    考虑下面的代码:

    var myvar = 'my value'; 
    alert(myvar); // my value

    当然,它会在屏幕上弹出my value,这是显而易见的。然而,跟着我的思路,让我们创建一个自执行匿名函数,它会达到同样的效果。

    var myvar = 'my value'; 
    
    (function() { 
      alert(myvar); // my value 
    })();

    好吧,这还是很显而易见的,我知道,现在让我们把这两个例子的代码混合在一起,在匿名函数内部创建一个相同的变量。

      var myvar = 'my value'; 
    
    (function() { 
      alert(myvar); // undefined 
      var myvar = 'local value'; 
    })();

    哈,为什么alert的值是undefined,哪怕我们声明了一个新的变量,函数执行仍然是同样的结果,所以它是没有效果的吗?

    变量声明的提升

    在函数的当前作用域中,无论变量声明的位置在哪里,浏览器将在后台提升知代码的头部,然而仅仅是变量的声明会被提升,而如果变量被初始化(已被赋值),仅仅变量的声明会被提升至代码的顶部,且将此变量的值设置为 undefined
    好了,让我们解读一下这变量声明变量初始化之间的差异,假设有这样的代码:var joe = 'plumber';
    变量声明

    var joe; // the declaration

    变量初始化

    joe = 'plumber'; // the initialization

    现在我们可以更容易地理解变量提升操作在浏览器引擎下发生了什么,考虑下面这个伪造的函数

    (function() { 
      var a = 'a'; 
      // lines of code 
      var b = 'b'; 
      // more lines of code 
      var c= 'c'; // antipattern 
      // final lines of scripting 
    })();

    全部的变量声明都在代码顶部

    请注意,上面的例子被认为是不好的做法。尽管如此,不管变量的位置在哪里,它们的声明都会在后台提升至代码顶部,像这样:

    (function() { 
      var a, b, c; // variables declared 
      a = 'a'; 
      // lines of code 
      b = 'b'; // initialized 
      // more lines of code 
      c= 'c'; // initialized 
      // final lines of scripting 
    })();

    开心时刻

    如果我们现在返回到文章开头提到的问题,undefined 的代码部分:

    var myvar = 'my value'; 
    
    (function() { 
      alert(myvar); // undefined 
      var myvar = 'local value'; 
    })();

    我们会对myvar 为什么会alerting出undefined 有更好的理解了。正如我们所学到的,当局部变量myvar 声明后,它会自动被浏览器提升至函数作用域的顶部,在alert 的时候,变量早已经声明完成,然而,因为变量的初始化不会被提升的,所以变量的值是undefined

    原文地址:JavaScript Hoisting Explained,作者: Jeffrey Way

  • 相关阅读:
    SVN如何新建用户并分配权限
    Android性能测试工具Emmagee介绍
    Jquery 中的$(this) 和javascript中的this
    Django 的开始之路
    Python 100道题深入理解
    怎么使用jquery判断一个元素是否含有一个指定的类(class)
    windows下面安装Python和pip
    Waves:类Material Design 的圆形波浪(涟漪)点击特效插件
    Python 基础语法(三)
    Python 基础语法(四)
  • 原文地址:https://www.cnblogs.com/xihe/p/6138613.html
Copyright © 2011-2022 走看看