let
ES6使用 let 命令来声明变量
1.与 var 声明变量相比,最大的特点是let不能重复声明。
<!--用let方法声明变量-->
<script type="text/javascript">
let a=10;
let a=11;
console.log(a);
</script>
控制台报错:Identifier ‘a’ has already been declared
<!--用var方法声明变量-->
<script type="text/javascript">
var a=10;
var a=11;
console.log(a);
</script>
控制台输出:11(a = 10 数据丢失)
*注:用 let 声明变量 a 后,用 var 声明 a 也会导致控制报错:Identifier ‘a’ has already been declared。
同理,用 var 声明变量 a 后,用 let 声明 a 也会导致同样的错误。
2.let声明只在所在的代码块内有效
<script type="text/javascript">
for(let i=0;i<1;i++){
//这里面能使用变量i
}
console.log(i);
</script>
因为let声明只在代码块(可以看作从 “{” 开始到 ”}“ 结束是一个代码块)内有效所以控制台报错:i is not defined
<script type="text/javascript">
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
// 控制台输出10
</script>
上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是10。
如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。
*另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
//控制台输出3次 abc,不会报错
3.let与var的其他区别事项
//1.单独执行console.log(foo)
console.log(foo);//报错:foo is not defined
-------------------------------------------
// var 的情况
console.log(a); // 输出:undefined
var a = 2;
-------------------------------------------
// let 的情况
console.log(b); // 报错:Cannot access 'b' before initialization
let b = 2;
变量 a 用 var 命令声明,会发生变量提升,即脚本开始运行时,变量a已经存在了,但是没有值,所以会输出 undefined 。变量 b 用let命令声明。这表示在声明它之前,变量b是不存在的,这时如果用到它,就会抛出一个错误。
var tmp = 123;
tmp = 'abc';
if (true) {
let tmp;
}
//这部分代码不会报错
var tmp = 123;
if (true) {
tmp = 'abc';
let tmp;
}
//ncaught ReferenceError: Cannot access 'tmp' before initialization
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
// 不报错
var x = x;
// 报错
let x = x;
//Uncaught ReferenceError: Cannot access 'x' before initialization
4.块级作用域
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 输出:5
}
ES6 允许块级作用域的任意嵌套。
内层作用域可以定义外层作用域的同名变量。
块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了。
// IIFE 写法
(function () {
var tmp = ...;
...
}());
// 块级作用域写法
{
let tmp = ...;
...
}
const
const声明一个只读的常量。一旦声明,常量的值就不能改变。所以 const 声明常量就必须立即进行初始化,不能留到以后赋值。其他与let基本相同
原文地址:https://blog.csdn.net/weixin_43873767/article/details/101465716
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。