资讯专栏INFORMATION COLUMN

js中的变量提升和函数提升

ruicbAndroid / 2760人阅读

摘要:而是一个更完善的,以前的是不完善的,他定义的变量是以函数为范围,而不是正常编程语言中的以一个大括号为范围,比如打印时仍然会打印若是一个没接触过的人肯定会大吃一惊,这就是一个最简单的变量提升的例子。

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

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

const与let

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

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

function() {

  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://www.ucloud.cn/yun/108584.html

相关文章

  • JS中的变量提升函数提升

    摘要:什么是函数作用域下的变量提升和函数提升函数作用域中也存在变量提升和函数提升,这个和全局作用域下的情况是一模一样的,就是把作用域想成是全局的就可以了。 在js中有一部分比较难以理解,却也是在笔试过程中很容易考的,那就是变量提升和函数提升的问题,这篇文章我会就变量提升和函数提升的问题拓展一下有关js函数的知识点,包括作用域的问题,后面还会有一些小练习来判断自己是否真的搞懂了。 作用域 在j...

    zhunjiee 评论0 收藏0
  • js 变量提升闭包理解

    摘要:变量的作用域无非就是两种全局变量和局部变量。其中内部函数中可以访问外部函数的变量,是因为内部函数的作用域链中包含了外部函数的作用域也可以理解为内部函数的作用范围辐射到了外部函数的作用范围另一方面,在函数外部自然无法读取函数内的局部变量。 以前学习的时候,了解过变量提升和闭包,但是没有深入了解,网上查了资料,这里记录下,只供参考。部分内容引用: https://www.cnblogs.c...

    luoyibu 评论0 收藏0
  • 原型模式故事链(4)--JS执行上下文、变量提升函数声明

    摘要:代码在执行之前会先全局中变量提升函数声明。函数的执行上下文,也就是在这个函数范围内找到函数执行上下文中函数范围内,所有用声明的变量。函数执行时,按照执行位置查找变量作用域只会向上查找。下一回变量作用域与闭包 上一章:JS的数据类型 传送门:https://segmentfault.com/a/11... 好!话不多少,我们就开始吧。对变量提升和函数声明的理解,能让你更清楚容易的理解,...

    melody_lql 评论0 收藏0
  • 原型模式故事链(4)--JS执行上下文、变量提升函数声明

    摘要:代码在执行之前会先全局中变量提升函数声明。函数的执行上下文,也就是在这个函数范围内找到函数执行上下文中函数范围内,所有用声明的变量。函数执行时,按照执行位置查找变量作用域只会向上查找。下一回变量作用域与闭包 上一章:JS的数据类型 传送门:https://segmentfault.com/a/11... 好!话不多少,我们就开始吧。对变量提升和函数声明的理解,能让你更清楚容易的理解,...

    zhigoo 评论0 收藏0
  • 原型模式故事链(4)--JS执行上下文、变量提升函数声明

    摘要:代码在执行之前会先全局中变量提升函数声明。函数的执行上下文,也就是在这个函数范围内找到函数执行上下文中函数范围内,所有用声明的变量。函数执行时,按照执行位置查找变量作用域只会向上查找。下一回变量作用域与闭包 上一章:JS的数据类型 传送门:https://segmentfault.com/a/11... 好!话不多少,我们就开始吧。对变量提升和函数声明的理解,能让你更清楚容易的理解,...

    netScorpion 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<