1、变量提升:(创建->初始化)-->赋值-->修改

就是说,以var声明的变量,它的声明会被提升到当前作用域的顶端(注意是变量声明提升,变量的赋值没有提升)

//在if语句中也会提升,跟js的解析顺序有关

  1.  
  2.   <script>
  3.     console.log(a);//undefined
  4.     var a = 10;
  5.     function test(){
  6.       console.log(a);//undefined
  7.       if(false){
  8.         var a =12;
  9.       }
  10.       console.log(a);//undefined
  11.       if(true){
  12.         var a =12;
  13.       }
  14.       console.log(a);//12
  15.     }
  16.     test();
  17.     console.log(a);//10
  18.   </script>

2 、那么如果用let和const声明的变量是否会提升?let和const是块级作用域,且存在死区的概念

  1. <script>
  2. var a = 10;
  3. function test(){
  4. console.log(a);//Cannot access 'a' before initialization
  5. let a = 12;//or const a = 12;
  6. console.log(a);//
  7. }
  8. test();
  9. console.log(a);//
  10. </script>

得出结论:let和const,不适用于变量提升;let和const有着'临时性死区'的概念,即从作用域开始到变量申明的这一部分,不能使用该变量,否则会报错。

3 、函数的声明提升:

函数声明方式有三种:

  1. 函数声明:function test(){};

  2. 函数表达式:var test = function(){};

其中 函数声明将会被提升:

  <script>
    test();//输出:函数声明
     var test = function(){
       console.log("函数表达式");
     }
     test();//输出:函数表达式
     function test(){
       console.log("函数声明");
     }
     test();//输出:函数表达式
 </script>

可以看出js中函数不存在重载的概念,后面一个同名函数会覆盖掉前面一个同名函数

4 、函数声明高于变量声明: //函数声明提升比变量声明提升的快,同时会忽略对同名变量的二次申明

  1. <script>
  2. console.log(test);/*输出:ƒ test(){console.log("函数申明");}*/
  3. function test(){
  4. console.log("函数申明");
  5. }
  6. var test;
  7. console.log(test);/*输出:ƒ test(){console.log("函数申明");}*/
  8. var test = 1;
  9. console.log(test);//
  10. </script>

5 、关于let,const的思考

  • const声明的变量如果包含引用类型的调用,是可以修改变量里引用类型指向的数据的

  • let和const声明的全局变量不会被定义成顶层对象的属性

  • let和const不能重复声明一个同名变量,是因为同名变量在栈中的地址问题?

  • js中数据分为基本和引用,存储在栈和堆中,var声明的变量,和let和const声明的在栈和堆中存储的方式是否有什么不同?

近期学习es6后对变量提升及let和const的一点思考的更多相关文章

  1. 关于JS中变量提升的规则和原理的一点理解

        关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...

  2. 关于JS中变量提升的规则和原理的一点理解(二)

    上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...

  3. ES6 - 基础学习(2): 新的变量声明方式 let 与 const

    ES6)新增加了两个重要的 JavaScript 关键字:let 和 const.以前声明变量时只有一种方式:var,ES6对声明方式进行了扩展,现在可以有三种声明方式了. 1.var:variabl ...

  4. 开始学习es6(二) let 与 const 及 块级作用域

    1.var JavaScript中,我们通常说的作用域是函数作用域,使用var声明的变量,无论是在代码的哪个地方声明的,都会提升到当前作用域的最顶部,这种行为叫做变量提升(Hoisting) cons ...

  5. ES6学习笔记(一)新的变量定义命令let和const

    1.一些历史 ES6(ECMAScript 6.0)是 JavaScript 语言的新一代标准,于2015 年 6 月正式发布,距今已经4年了,它的目标,是使得 JavaScript 语言可以用来编写 ...

  6. JS 作用域与变量提升---JS 学习笔记(三)

    你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(f ...

  7. ES6学习之let声明变量的学习

    1.let和var类似, (1)let与var不同的点:let没有预编译,变量提升这个过程,let声明的变量只能在当前作用域内访问到(一个{}可以看做是一个作用域),在全局var声明的变量属于wind ...

  8. es6 学习1 let表示变量 、const表示常量 与 var 变量的区别

    一.let 1.看下代码,在函数中无论在哪里声明变量,都会自动提到函数顶部,这就是函数变量提升,它的作用于为当前函数中. function aa() { if(bool) { var test = ' ...

  9. 【系统学习ES6】第一节:新的声明方式

    [系统学习ES6] 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握.计划每周更新1-2篇,希望大家有所收获. 以前用ES5时,声明变量只能用var.ES6的出现,为我们带来了两 ...

随机推荐

  1. XCTF-CAT

    果然还是我太菜了呜呜呜,这道题仍然是没有自己做出来.哎. 这一道用的并不是PHP的环境,而是用Python中的Django编写的. 记得做过类似的一道题目.来源于MOCTF中的网站扫描器,当时做完后其 ...

  2. 02-19 k近邻算法(鸢尾花分类)

    [TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...

  3. e课表项目第二次冲刺周期第二天

    昨天干了什么? 昨天与我们小组的成员商量了一个重大的决定,确定了我们转型发展的主题,简要的设计了我们软件要实现的功能,并且完成了首导航栏的设计,和一部分框架的内容填充. 今天干了什么? 我们组今天通过 ...

  4. 【bzoj2342】[Shoi2011]双倍回文

    这题属于博主还未填坑系列,先嘴巴AC,到时候有时间再搞字符串时,再来好好填坑. 废话不多说上题: 题解: 显然是和马拉车有关的吧,我们可以先对整个串跑一个马拉车,然后枚举‘#’好字符,并以他为中心,在 ...

  5. 利用golang优雅的实现单实例

    平时编写代码过程中,经常会遇到对于全局角度只需运行一次的代码,比如全局初始化操作,设计模式中的单例模式.针对单例模式,java中又出现了饿汉模式.懒汉模式,再配合synchronized同步关键字来实 ...

  6. 爬虫破解知乎登入(不使用Selenium模块)

    一.分析 知乎完成登入的步骤 首先获得cookies(如果不获得后面验证码无法获得) 获得验证码 提交登入相关内容 前两步简单稍微细心寻找规律即可 其中最难的是第三步应该他前端进行了js加密 这里没什 ...

  7. CSP2019 考前复习

    动态规划 [NOIP2016]愤怒的小鸟(状压+思维) 多组数据题 共有i只猪,给出每只猪的坐标,鸟的飞行轨迹为经过原点的抛物线,求最少要多少只鸟能消灭所有的猪 \[ 猪数量n<=18 \] 看 ...

  8. JS循环+循环嵌套+经典例题+图形题

    首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...

  9. 05jmeter-responses中有多组json数据,提取同一条json数据的两个字段

    某接口返回结果如上图,取id和groupNo 1.读取确定的某条json数据:如取第一条,一个JSON Extractor即可实现 2.随机读取某条json数据: 需要两个JSON Extractor ...

  10. epoll(2) 使用及源码分析的引子

    epoll(2) 使用及源码分析的引子 本文代码取自内核版本 4.17 epoll(2) - I/O 事件通知设施. epoll 是内核在2.6版本后实现的,是对 select(2)/poll(2) ...