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

  • 相关阅读:
    Shell入门
    Linux基本的指令操作
    python网络爬虫入门范例
    Android中scrollview的scrollto方法不起作用的解决办法
    (转)Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
    unable to load class org.codehaus.groovy.runtime.typehandling.shorttypehandling解决方法
    JavaScript运行原理
    AsyncTask的doInBackground不工作原因分析
    Android中的多线程与异步任务
    使用webview加载网页时session同步
  • 原文地址:https://www.cnblogs.com/xihe/p/6138613.html
Copyright © 2011-2022 走看看