文章标题
来源:互联网 发布:枕头什么牌子好 知乎 编辑:程序博客网 时间:2024/06/06 04:02
ES6中的变量声明(let,const)
ECMAScript6.0(简称es6)是javascript语言新一代标准,已经在2015年6月正式发布。
在这里介绍下es6中的变量赋值(let,const与var之间的区别)
首先,let的用法基本上和var相同,不存在变量提升、
存在暂时性死区(使用let声明变量之前,该变量是不可用的)、
不允许重复声明、块级作用域。
let的用法:
//块的概念{ let a = 10; var b = 1; console.log(a); // 10}console.log("a:" + a); // a is not definedconsole.log("b:" + b);//let在for循环中的使用for(let i = 0; i < 10; i++){}console.log(i); // i is not defined//var在for循环中的使用for(var j = 0; j < 10; j++){}console.log(j); // 10//数组var c = [];for(var k = 0; k < 10; k++){ c[k] = function(){ console.log(k); };}c[6](); // 10//数组var d = [];for(let l = 0; l < 10; l++){ d[l] = function(){ console.log(l); };}d[6](); // 6
不存在变量提升
var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined
let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错
console.log(foo); //undefinedvar foo = 2;console.log(bar); //bar is not definedlet bar = 2;
暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响
在ES6中声明,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
var tmp = 123;if(true) { tmp = "abc"; let tmp; //tmp is not defined}if(true){ // TDZ开始 tmp = "abc"; // ReferenceError let tmp; // underfined console.log(tmp); //underfined tmp = 456; console.log(tmp); //456}console.log(tmp);//abc
上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。
typeof x;let x; //x is not definedconsole.log(typeof x); //underfinedfunction bar0(x = y, y = 2){ // 死区,报错,提前声明 return [x,y];}bar0();function bar1(x = 2, y = x){ return [x,y];}console.log(bar1()); //[2, 2] var x = x;let x0 = x0; //x0 is not defined
不允许重复声明
let不允许在相同作用域内,重复声明同一个变量
function fn0(){ let a = 10; var a = 1;}fn0();//报错
function fn1(){let a = 10;let a = 1;}fn1(); // 报错
不能在函数内部重新声明参数
func(1);function func(arg){ let arg; //报错 { let arg; }}
块级作用域
let实际上为 JavaScript 新增了块级作用域
var tmp = new Date();function f(){ console.log(tmp); if(false){ var tmp = 'hello world'; }}f(); //underfined 变量提升,导致内层的tmp变量覆盖了外层的tmp变量function f1(){ let n = 5; if(true){ let n = 10; } console.log(n); //5}f1();
下面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。
{ {let insane = 'Hello World'} // console.log(insane);//insane is not defined};
内层作用域可以定义外层作用域的同名变量。
{ let insane = "Hello World"; {let insane = "Hello World"}};
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
(function(){ var tmp = 0;}());{ let tmp = 0;}
const命令 基本用法
const声明一个只读的常量。一旦声明,常量的值就不能更改
只声明不赋值,就会报错
const的作用域与let命令相同:只在声明所在的块级作用域内有效
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用
const声明的常量,也与let一样不可重复声明。
const PI = 3.1415;console.log(PI);PI = 3;//Assignment to constant variable.const fooo;// Missing initializer in const declaration// 将对象彻底冻结的函数var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === 'object' ) { constantize( obj[key] ); } });};
若是发现错误,请点评,新手
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- iOS——UITabBarController
- Android中的Context详解
- 翻转链表
- caffe 安装问题
- ionic2 提示内容
- 文章标题
- java线程池模式--来自work thread模式的优化
- 仿QQ空间点赞动画
- 菜鸟第一次写博客
- maven 加入json-lib.jar 报错 Missing artifact net.sf.json-lib:json-lib:jar:2.4:compile
- nio
- HttpServletRequest和ServletRequest
- 特征选择和特征提取区别 、PCA VS LDA
- Q96:过程纹理(Procedural Texture)(0)——概述