• 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

  • 相关阅读:
    Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介
    Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度
    Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同
    C#实现网页正文提取算法ok
    网页正文提取的思路
    sql getdate() 时间格式设置
    分页,静态程序asp实现,php同理
    网页正文抽取能用的抽取代码java
    泛采集技术
    查询一个数据表中的数据并插入到另一个数据表
  • 原文地址:https://www.cnblogs.com/xihe/p/6138613.html
Copyright © 2020-2023  润新知