zoukankan      html  css  js  c++  java
  • js中的变量提升和函数提升

    从上周开始,我所在的学习小组正式开始了angular的学习,angular是全面支持es6的,所以语法上和以前的angular有了很大的不同,比如变量声明时就抛弃了var,而选择了let和const;记得刚开始学习js的时候,使用webstrom时用var,webstrom会在下面画一条小绿线,表示这个用法,问题不大,但是有点问题。因为webstrom推荐使用最新的标准,之后问过学长,他说这是es6的语法,暂时不用管,防止浏览器不兼容。

    终于,现在到了学习es6的时候。

    const与let

    const就是定义一个常量,即一个无法改变的量。

    而let是一个更完善的var,以前的var是不完善的,他定义的变量是以函数为范围,而不是正常编程语言中的以一个大括号为范围,比如:

      for(var i=0;i<10;i++){
              var a = 'a';
        }
    
        console.log(a);  // a
    
    

    打印a时仍然会打印'a',若是一个没接触过js的人肯定会大吃一惊,这就是一个最简单的变量提升的例子。而let就解决了这个问题。它定义的变量就是块级的。

    变量提升与函数提升

    上面已经说了一个变量提升的最简单的例子,下面介绍一下为什么:

    通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理

    下面来说说函数提升,同样的,让我们先看个例子:

    function hoistFunction() {
        foo(); // output: I am hoisted
    
        function foo() {
            console.log('I am hoisted');
        }
    }
    
    hoistFunction();
    

    函数可以在声明之前就可以调用,这是因为引擎是把函数声明整个地提升到了当前作用域的顶部,预编译之后的大概代码如下:

    function hoistFunction() {
        function foo() {
            console.log('I am hoisted');
        }
    
        foo(); // output: I am hoisted
    }
    
    hoistFunction();
    

    总结

    变量提升和函数提升可以远比上面那个例子复杂,但对我们意义并不大,毕竟对于变量已经有了完善的let定义方法,而函数提升,在能不用的情况最好不用,毕竟他是不规范的,学习这个,只是为了以后看到相关代码时能够看懂,否则,看这种代码时肯定一脸懵逼。
    (另外说一句,函数提升是专门设计的,有其特殊用途,而变量提升纯粹是设计语言时的失误,但两者都应该少用,毕竟都不规范,想要详细了解,可以点这里

    原文地址:https://segmentfault.com/a/1190000017025533

  • 相关阅读:
    PHP的ip2long和long2ip函数的实现原理
    PHP在浏览器上跟踪调试的方法以及使用ChromePhp、FirePHP的简单介绍
    PHP静态延迟绑定简单示例
    [deviceone开发]-do_Socket组件示例
    [deviceone开发]-大家比较关注的应用内部升级
    [deviceone开发]-do_Viewshower的动画效果示例
    [deviceone开发]-企业OA项目开源分享
    [deviceone开发]-do_RichLabel的简单示例
    [deviceone开发]-直播APP心形点赞动画示例
    [deviceone开发]-纳豆项目源码开源
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9968957.html
Copyright © 2011-2022 走看看