1、ES6声明变量的方式
1、es5的声明方式var的问题
1)是var在同一个作用域内部,是可以重复声明一个变量的,后面的会把前面的覆盖掉
2)var存在变量提升到的问题,就是在使用var声明变量前是可以先使用此变量的
2、let与var的不同的特点
1)let不能重复声明
2)let是不存在变量提升
3)块级作用域存在暂存死区(即这个区域不能存在同名的变量了,已经是将这个区域与这个变量绑定了)
在es5中if的括号不是一个块级作用域,所以下面的例子中的打印是执行的
if ( false ){
var lagev = 'jkgba';
}
console.log(lagev);//undefined
类似于下面:
var lagev ;
if ( false ){
lagev = 'jkgba';
}
console.log(lagev);
但是使用let声明时,是存在块级作用域的,只能在作用域内部访问
if ( false ){
let lagev = 'jkgba';
}
console.log(lagev);//报错,未定义
另外一个是在for循环的例子
for(var i=0; i<3; i++){
//....
}
console.log(i) ; //此时打印出i是为3的,因为var声明的 i 是一个全局变量,每次循环都会使用同一个 i
而使用let做循环时,每次的循环体都是一个块级作用域,每次的循环都会重新声明一个块级作用域内的变量 i,并且会把上一次的值作为下次声明的初始值,,即每次循环的i值是和当前的循环体绑定的
for( let i=0; i<3; i++){
document.addEventListener('click',function(){
alert(i); //此时的 i 就是0、1、2了
})
}
这个问题如果使用es5中的var来实现的话,就需要使用闭包了,把每次的i值保存下来,实际上使用let进行编译之后也是用的闭包实现的,所以let的性能可能会比var差一些,
不过现在Chrome的V8引擎性能很强大,并且还在不断的做优化
3、es6中新增了声明常量
声明赋值之后不能改变,并且特性是同let
const ULIR = 10;
ULIR = 2; //此时会报错,类型错误
一般项目中是用于引入模块,不希望再改变的
1、ES6声明变量的方式的更多相关文章
- ECMAScript 6 入门——ES6 声明变量的六种方法
ES6 声明变量的六种方法 ES5 只有两种声明变量的方法:var命令和function命令.ES6 除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和cla ...
- JavaScript 一、 ES6 声明变量,作用域理解
// JavaScript/* * ========================================================= * * 编译原理 * 尽管通常将 JavaScr ...
- ES6 声明变量的6种方法
ES5 只有两种声明变量的方法:var命令和function命令. ES6除了添加let和const命令,后面章节还会提到,另外两种声明变量的方法:import命令和class命令.所以,ES6 一共 ...
- ES6 声明变量的六种方法
ES5 只有两种声明变量的方法: var 命令和 function 命令. ES6 除了添加 let 和 const 命令, 后面章节还会提到, 另外两种声明变量的方法: import 命令和 cla ...
- 【ES6 】声明变量的方式
var function let const import class
- es6 新增变量声明方式
let 与 var var var声明的变量拥有全局作用域或者局部作用域 在全局中声明变量即为全局变量 在函数中声明变量即为局部变量 而var在使用过程中也逐渐暴露出许多问题 var的几大问题 变量提 ...
- IOS OC声明变量在@interface括号中与使用@property的区别
方式一:直接在@interface中的大括号中声明. @interface MyTest : NSObject{ NSString *mystr; } 方式二:在@interface中声明,然后再在@ ...
- IOS OC声明变量在@interface括号中与使用@property的区别(转载)
刚开始接触OC再看别人写的代码的时候,常常困惑于人家在声明属性时的写法,总结出来有三中方式,不知道哪一种比较规范化,现在我把三种方式贴出来,然后再一一探讨每个方式声明属性的区别. 方式一:直接在@in ...
- 【学习总结】声明变量在@interface括号中与使用@property的区别
方式一:直接在.h文件@interface中的大括号中声明. @interface Test : NSObject { NSString *str; // 私有变量 , 其他类无法访问,只能够该类内部 ...
随机推荐
- Vivado debug异常现象
前言 bit文件和ltx文件的信号位宽不匹配问题.用了dont_touch等属性没用... WARNING: [Labtools 27-1972] Mismatch between the desig ...
- vuex页面刷新数据丢失的解决办法
在vue项目中用vuex来做全局的状态管理, 发现当刷新网页后,保存在vuex实例store里的数据会丢失. 原因: 因为store里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例 ...
- Android笔记(五十三) 利用有道OPENAPI做简单的翻译demo
先去 http://fanyi.youdao.com/openapi?path=data-mode 申请开发者key 有道api会自动将申请的单词翻译并返回为xml或者json格式,我们所需要做的就是 ...
- Flask之flask-sqlalchemy
接下来基于这个Flask项目,我们要加入Flask-SQLAlchemy让项目变得生动起来 1.加入Flask-SQLAlchemy第三方组件 from flask import Flask # 导入 ...
- [ipsec][crypto] 有点不同的数字证书到底是什么
前言 前言是在写完了全文之后回头补的.本意是想完全抽象的把证书的抽象逻辑意义表达出来,因为你能找到的大部分 资料都深陷在技术细节与行业规范里.只有其型没有其理,没有什么比理解一个事物的内在合理性更有乐 ...
- mysql 压力测试工具sysbench
2.1 只读示例 ./bin/sysbench --test=/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=1 ...
- linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...
- gsoup webservice
SoapUI调用webservice实现的两种方式 gsoup https://blog.csdn.net/zhuzhihai1988/article/details/8131370
- 0028ssm环境搭建(springmvc+spring+mybatis)
spring整合springmvc和mybatis主要分为如下几个步骤: 1.spring环境搭建 2.springmvc环境搭建 3.spring整合springmvc 4.spring整合myba ...
- szwyadmin程序漏洞拿shell【方法笔记】
我们在Google中搜索关键词 关键字:inurl:szwyadmin/login.asp 任意打开一个搜索结果,打开登录界面后在地址栏中输入下面的代码: 代码: javascript:alert(d ...