细说 let 与 var 的不同之处
来源:互联网 发布:wifi免费打电话软件 编辑:程序博客网 时间:2024/06/03 07:07
细说 let 与 var 的不同之处
最近看了阮一峰大大的《es6 标准入门》,感觉写的很详细,今天就给各位读者老爷们详细的说一下 let 与 var的不同之处,有不严谨的地方还请多多指教
基本用法
{ let a = 10; var b = 20; } console.log(a) // undefined console.log(b) // 20
在代码块中用 let 和 var 分辨定义了 a 和 b 两个变量,但是在代码块外面调用这两个变量,a 返回undefined,b返回正确的值,这就表明了
let 声明的变量只在其所在的代码块中有效
再来一个例子
for(let i = 0;i < 9;i++){ setTimeout(function(){ console.log(i) // 0~8 },1000); } for(var i = 0;i < 9;i++){ setTimeout(function(){ console.log(i) // 9个9 },1000); }
在这段代码中,用 let 的 for 循环最终打印出来的是 0~8;而用 var 的 for 循环最终打印出来的是 9 个 9。
这就是说明了 let 声明的变量 i 只在本轮循环有效,所以每一次的 i 都是一个新的变量,并不会覆盖上一次循环出来的 i ;而 var 声明的变量在每一次循环 i 都会被新的 i 值所覆盖,最终打印出来的是 9 个 9.
先声明再使用
let 并不像 var 那样会存在“变量提升”的现象,所以一定要先声明之后再使用,否则会报错的;
例如:
console.log(a) // ReferenceError let a = 222;
还有一种
var a = 222; if (true) { a = 666; let a; } console.log(a); // ReferenceError: a is not defined
上面的代码中存在着全局变量 a ,但是在 if 这个作用域内 let 又声明了一个局部变量 a ,导致了 a 绑定了 if 这个作用域,所以调用 a 的话会报错。
ES6 明确规定,如果区块中存在 let 和 const 命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要在声明之前使用这些变量,就会报错。
还有一种情况,比较隐蔽,例如:
function test1(x = y;y = 222){ return [x,y]; } test1(); // 报错 function test2(x = 222;y = x){ return [x,y]; } test2(); // [222,222]
所以,let 一定要先声明变量在使用
不允许重复声明
let 跟 var 不同,在同一个作用域内,var 可以重复声明同一个变量,但是 let 是不允许的。
下面这几种情况都是不被允许的:
function fun1(){ let a = 10; var a = 20; // 报错 } function fun2(){ let b = 10; let b = 20; // 报错 } function fun3(a){ let a = 10; // 报错 }
let 不允许在相同作用于内重复声明同一个变量,而且不能在函数内部重新声明参数
下面这种情况可以:
function fun(a){ { let a = 10; } }
关于 let 和 var 之间的一些小小区别暂时就到这里了,再次感谢阮一峰大大的《ES6标准入门》,有不严谨的地方欢迎各位读者老爷们指正。
- 细说 let 与 var 的不同之处
- var 与 let 的区别
- let与var的区别
- ECMAScript中let与var的区别
- ES6----var与let的区别
- ES6中let与var的区别
- 再探var与let
- ECMAScript6 let 与 var
- var与const与let之间的区别
- javascript中var与let与const的区别
- var与let,const区别
- JavaScript中的let与var
- var 与let const比较
- JavaScript中的let与var
- ES6 中的let、const与var的区别
- ES5中的var与ES6中的let,const的区别
- JavaScript ES6中const、let与var的对比详解
- 【JavaScript】let与var的区别及变量、函数提升
- Centos下 Nginx安装与配置
- SAP_BW建模第三步之创建数据包(InfoPackage)
- 0810-Java 重写(Override)与重载(Overload)
- OGNL入门
- websocket服务器搭建方案简介
- 细说 let 与 var 的不同之处
- 第二章:vue2组件的生命周期钩子函数
- XML和DTD,正则表达式
- 圆的反演
- Kali2017安装openvas7.02
- 设计模式-GOF行为模式(6-11)
- (转)亚马逊创始人贝佐斯:前进路上,善良远比聪明重要
- poj3069贪心
- Mantle的一个坑被我踩到了,快来围观