let声明变量

用法类似于var,但是所声明的变量只在let所在的代码块内有效。

1 . 在ES6环境下,let声明的变量不能在声明之前调用。

例:  

console.log(i);  //会报错,这叫做暂时性死区,会提示 i 未定义

let i ;  

let不允许在变量还没声明完成前,赋值给其他变量,或者是自己

let a = a;  //报错

应该先声明,再赋值

let a ;

a = 1;

或者直接赋值

let a = 1;

var b = b;  //不会报错,但是会返回undefined,没有赋值

var a;  

2 . 在同级作用域中不能定义多个相同的 let 变量,在不同的作用域中,let 变量不会相互影响

let i = 1;

function foo(){

  let  i = 2;

  let  i = 3;

  console.log( i );

 //会报错,显示变量已经声明过了。

}

foo();

comsole.log( i )  //打印 1

3 . let变量只能在定义的作用域中使用,不能在该作用域之外调用,只要块级作用域存在let命令,它所声明的变量就绑定这个区域不再受外部影响

let s = 0;

var a = "我是外面的";

function li(){

  a = "我在里面了"

  let s = 1;

  let a = "我最大";

  function lon(){

    let s = 2;

    console.log(s);   //打印 2

}

  lon();

  console.log(s);  //打印  1

  console.log(a);   //打印 “ 我最大 ”

};

li();

4.若使用for循环let变量,let变量只在当前循环体内有效,在外面引用就会报错,每次循环时都会创建一个let变量,

js引擎会记住上一次循环的值。for循环设置循环变量的那部分是一个父作用域,而循环内部是一个单独的子作用域。

 
 
 
                              块级作用域

es6允许块级作用域任意嵌套,块作用域取代了立即执行函数(IIFE)不再必要了
{{{{
  let insst = '你好';
  {let insst = 'hello';}
  console.log(insst)//你好
}}}};

ES5中,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域中
声明
//es5中会得到"I am inside!",以为在 if 内声明的函数 f 会被提升到函数头部

function lis(){ console.log("123")};

  (function(){
  //es5中,lis方法会提升到这
    if(true){
      function lis(){ console.log("块作用域声明");}
    }
   lis();//显示 块作用域声明
  }());

lis();//显示的全局方法;

ES6允许在块级作用域中声明函数,块级作用域之中,函数声明语句的行为类似于
let,在块级作用域之外不可引用,但是如果真的在ES6浏览器中应用,还是会报错

function lis(){ console.log("123")};
  (function(){
    if(true){
      function lis(){ console.log("块作用域声明");}
    }
    lis();//显示块作用域
  }());

原因:如果改变了块级作用域内声明的函数的处理规则,显然会对老的代码产生
很大影响,为了减轻因此产生的不兼容问题,ES6规定,浏览器的实现可以不遵守
其规定,有自己的行为方式

1.允许在块级作用域内声明函数
2.函数声明类似于var,既会提升到全局作用域或函数作用域的头部
3.同时,函数声明还会提升到所在的块级作用域的头部

这三条规则只对ES6的浏览器有效,其他环境不用遵守,还是将块级作用域的函数
声明当做 let 处理

考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数,如果
确实需要,也应该写成函数表达式,而不是函数声明语句。

{ //不要使用这种
  let a = "in of itt";
  function f(){
    return a;
  }
}

{ //块级作用域内优先写成函数表达式
  let a = "in of itt";
  let f= function (){
    return a;
  }
}

ES6的块级作用域必须要有大括号,如果没有大括号js引擎就认为不存在块级作用域

if(true) let x = 1;//报错

  if(true){
    let x =1; //正确
}

                              const

const声明的叫做常量,与let的特性相差不多,不过除了有let的那些特性之外,它还有自己独立的特点;

const命令
声明一个只读的常量,一旦声明,常量的值就不能改变

const PI = 3.1415;
PI = 3 //会报错

const声明的常量不得改变值,这意味着const一旦声明常量,就必须立即初始化,
不能留到以后赋值。

const foo; //只声明不赋值,会报错
const的作用域与let命令相同:只在声明所在的块级作用域内有效。

详情解释:

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据
不得改动。对于简单的数据(数值,字符串,布尔值),值就保存在变量指向的那个
内存地址,因此等同于常量,但对于复合类型的数据(主要是对象和数组),变量指向
的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的
(既总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全
不能控制了。

const foo = {};
//不报错
foo.lets = 3;
//上面的foo常量存储的是一个地址,这个地址指向一个对象,地址不能变,
//但是对象里面的属性可以变,所以依然可以为其添加新属性。

const foo = {};
//不报错
foo.lets = 3;
//上面的foo常量存储的是一个地址,这个地址指向一个对象,地址不能变,
//但是对象里面的属性可以变,所以依然可以为其添加新属性。
console.log(foo.lets);

const foo = [];
foo.push('Hello'); //使用方法添加,成功
foo.length //成功
foo = ['123'] //失败,不能直接为foo赋值数组
console.log(foo)

const foo = Object.freeze({});
//Object.freeze()
// 阻止对象的任何修改,比如:添加,删除,替换,以及对象的属性
//严格模式下会报错;
//常规模式下,下面一行没用
foo.prop = 123;
console.log(foo)

注:

今天在网上学到的,与大家共同分享,并且记录下来,如有错误,请指出,谢谢!

ES6的 let const 以及块级作用域的更多相关文章

  1. ES6系列之let/const及块级作用域

    本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...

  2. ES6-let、const和块级作用域

    1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...

  3. let/const及块级作用域

    本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...

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

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

  5. ES6入门一:块级作用域(let&const)、spread展开、rest收集

    let声明 const声明 块级作用域 spread/rest 一.let声明与块作用域 在ES6之前,JavaScript中的作用域基本单元就是function.现在有了let就可以创建任意块的声明 ...

  6. 《浏览器工作原理与实践》<09>块级作用域:var缺陷以及为什么要引入let和const?

    在前面我们已经讲解了 JavaScript 中变量提升的相关内容,正是由于 JavaScript 存在变量提升这种特性,从而导致了很多与直觉不符的代码,这也是 JavaScript 的一个重要设计缺陷 ...

  7. ECMAScript概述及浅谈const,let与块级作用域

    ECMAScript可以看作javascript的标准规范,实际上javascript是ECMAScript的一门脚本语言,ECMAScript只提供了最基本的语言JavaScript对ECMAScr ...

  8. 12.24 ES6浅谈--块级作用域,let

    第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...

  9. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

随机推荐

  1. .NET框架 - NETCORE + API + EF + MYSQL

    .NET框架 - NETCORE + API + EFCORE + MYSQL 1. 新建项目: 本文中使用 框架 .netcore2.2 . 2. 生成项目框架 3 安装MYSQL插件 点击“工具” ...

  2. 使用 LD_PRELOAD 变量拦截调用

    背景&原理 很多 a.out 程序都依赖动态库 libc.so, 比如使用 strcmp() 比较密码, 其实是不安全的 使用 LD_PRELOAD 变量可以使该变量中的可链接文件(编译时使用 ...

  3. 整理一些vue elementui 问题 + 链接方法

    1.前端通过spark-md5.js计算本地文件md5 2.vue如何利用自定义的事件,在子组件中修改父组件里边的值 3.vue子组件获取父组件的内容(props属性) 4.Element ui se ...

  4. JetBrain server certificate is not trusted 弹出框

    To get rid of the pop up message go to below location and click on Accept non-trusted certificates a ...

  5. python3 练手实例2 解一元二次方程组

    import math def y(): a,b,c=map(float,input('请输入一元二次方程式ax^2+bx+c=0,abc的值,用空格隔开:').split()) d=math.pow ...

  6. Linux 下的各种环境安装

    Linux 下的各种环境安装 1.安装 python Centos7  安装  python 2.7 : https://www.cnblogs.com/Jomini/p/10507077.html ...

  7. easyui datagrid使用按钮

    $('#datagrid').datagrid({ border:false, fitColumns:true, singleSelect: true, url:url, columns:[[ {fi ...

  8. 【译】索引进阶(十二):SQL SERVER中的索引碎片【中篇】

    原文链接:传送门. 为了讨论碎片产生的原因,以及避免和移除索引碎片的技术,我们必须从本进阶系列后续将介绍的两个章节借用一些知识点:创建/更新索引的知识,以及向一个索引表插入数据行的相关知识. 当我们讲 ...

  9. 使用scrapy爬虫,爬取起点小说网的案例

    爬取的页面为https://book.qidian.com/info/1010734492#Catalog 爬取的小说为凡人修仙之仙界篇,这边小说很不错. 正文的章节如下图所示 其中下面的章节为加密部 ...

  10. Redis 和 I/O 多路复用

    最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的 ...