在ES6中,js首次引入了块级作用域的概念,而什么是块级作用域?

众所就知,在js当中存在预解析的概念,就是变量提升。并且只存在全局作用域和私有作用域。在全局定义的变量就是全局变量,而在函数内部定义的变量称为私有变量。而在if判断和for循环之类的都是全局变量。

而块级作用域,就是在一个作用域中,该变量只能在声明后才能使用,并且该变量只在该作用域有效。

而let给js带来了块级作用域    那么我们就细讲一下let

 //块级作用域的变量只能在块级作用域有效,否则报错
{
var a=2;
let b=3;
}
console.log(a); //
console.log(b);//Uncaught ReferenceError: b is not defined
 //块级作用域变量不能重复声明变量
{
let a;
let a;
}
//会出现 Identifier 'a' has already been declared
 //块级作用域只能在声明赋值后才能使用
{
let a=b; //b还没有声明赋值
let b=10
}
// Uncaught ReferenceError: b is not defined
 var arr=[];
for(let i=0;i<10;i++){
arr[i]=function(){
return i
};
}
console.log(arr[3]()); //3 如果用var的话 肯定就是10 啦
 //在块级作用域中  for分父级作用域与子级作用域
for(let i=0;i<10;i++){
let i='123';
console.log(i); //打印10次 123 在同一块级作用域下是不能重复声明的 所以 ()与{} 在不同作用域
}

那ok   let就先结束了。

const是用来声明常量的,感觉js越来与后端语言靠近

我们都知道常量的值是不允许改变的,但是我们不能简单的理解内容不能改变,在js中,对象都是引用类型,而const在声明一个对象常量的时候,他存储的是这个对象的地址,只要这个地址不改变,const就不会报错,至于在地址存储的什么东西,那就跟const就没有太大关系了  比如:

 const obj={
name:'xuwen'
}
obj.age=27;
console.log(obj);//Object {name: "xuwen", age: 27}

同样,const声明一个变量也给js带来了块级作用域,比如说块级作用域只在作用域里面才有效,比如块级作用域不能重复声明变量 ,比如作用域变量只能在声明后才能使用这些上面都提到过就不重复了。

ok,结束const

那么我们再说一下顶层对象的属性

在ES6之前,顶层对象的属性和全局变量是等价的。

顶层对象在浏览器中指的就是window对象  在node里面就是global对象

 //我们在全局作用域下   使用一个  a=10   相当于window.a=10

那么我们现在是ES6时代了,当然是有所改变的

我们在用  let   const  class声明变量的时候不再属于顶层对象了

let a=10
window.a //undefined

至于node当中的global对象    哎,其实我也不是特别的熟悉。顶层对象的不同肯定会导致兼容性的问题的,至于如何解决,以后再说吧。

let与const详解的更多相关文章

  1. const详解

    详解C++中的const关键字

  2. C++中的指针(*)、引用(&)、const详解(一、定义变量)

    一.前言 本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性. ...

  3. C++中的const详解

    const的用法,特别是用在函数后面 在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针.可以改变this所指向的值,但不能改变 this所保存的地址. 在 const ...

  4. C++ 中的 const 详解

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4235721.html 1.为什么使用 const int 而不使用 #define 在使用# ...

  5. C++ 常量类型 const 详解

    1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的 ...

  6. [js高手之路] es6系列教程 - var, let, const详解

    function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...

  7. ES6 let和const详解及使用细节

    ES6之前javascript只有全局作用域和函数作用域,所以经常会遇到变量提升了或者使用闭包的时候出错的问题. 所有a[i]都会输出10: var arr=[]; for (var i=0;i< ...

  8. ES6中let和const详解

    let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...

  9. 函数新特性、内联函数、const详解

    一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...

随机推荐

  1. Android之利用正则表达式校验邮箱、手机号、密码、身份证号码等

    概述 现在Android应用在注册的时候基本会校验邮箱.手机号.密码.身份证号码其中一项或多项,特此收集了相关的正则表达式给大家分享.除了正则表达式,文章末尾提供Demo中有惊喜哦! 具体验证的图片效 ...

  2. MAT(Memory Analyzer Tool)使用心得

    起因:最近在跟踪产品的性能问题,期间主要问题体现在JVM的内存回收问题,使用MAT工具进行JVM内存分析(也可对android 的应用内存分析) 问题描述: 1.部分后端服务在运行一段时间后会突然年老 ...

  3. 移植 DeepinQQ 到 Fedora 中

    本着自由/开源软件的分享精神创作此文,如有任何权力侵害请联系我,我将积极配合. 移植 DeepinQQ 到 Fedora 中 --也不知道是用移植还是迁移更合适 写在前面 首先,在这里要感谢武汉深之度 ...

  4. php基础知识(二)---2017-04-14

    1.字符串的三种表达形式: (1)双引号 (2)单引号 (3)尖括号 $s = <<<A <div style="width:500px; height:100px; ...

  5. Rookey.Frame v1.0极速开发平台稳定版发布

    Rookey.Frame v1.0经过一年时间的修改及沉淀,稳定版终于问世了,此版本经过上线系统验证,各个功能点都经过终端用户验证并持续优化,主要优化以下几个方面: 1.性能较原来提升3倍之多 2.修 ...

  6. 利用jackson-databind,复杂对象对象和json数据互转

    如果简单对象,那么转换的方式比较多,这里指的复杂对象,是指对象里面存在cycle引用,比如: /** * @author ding * */@Entity@Table(name = "ser ...

  7. sqoop关系型数据迁移原理以及map端内存为何不会爆掉窥探

    序:map客户端使用jdbc向数据库发送查询语句,将会拿到所有数据到map的客户端,安装jdbc的原理,数据全部缓存在内存中,但是内存没有出现爆掉情况,这是因为1.3以后,对jdbc进行了优化,改进j ...

  8. FrameBuffer系列 之 相关结构与结构体

    在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备 ...

  9. hibernate 多对多关系总结

    hibernate中,对对象关系的映射处理估计是最让人迷惑和头疼的,特别是cascade和inverse属性的使用,不知已经杀死了我多少个脑细胞了,好记性永远比不上烂笔头,为了能节省自己的脑细胞,降低 ...

  10. myeclipse/eclipse 配置SSM框架错误之一解决方法

    报错如下: 1. [org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initializatio ...