es6新增了let命令,用来声明变量。用法类似于var,但其声明的变量只在let命令所在的代码块有效。
1.1let命令的作用域只在当前代码块
示列1:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>let命令作用域</title>
</head>
<body>
</body>
<script type="text/javascript">
{
let a = 10;
var b = 20;
}
console.log(b); // 20
console.log(a); // ReferenceError: a is not defined
</script>
</html>
在示列1中,分别用let和var声明一个变量,然后再代码块外打印输出。结果let声明的变量报错,var声明的变量可返回正确的值,说明let只在所在代码块起作用。
1.2使用let声明的变量作用域不会提前
var支持“变量提升”,即变量可以在声明前使用,值为underfind。let命令改变了其语法行为,声明的变量一定要声明后才可以使用,否则报错。
示列2:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>let命令作用域</title>
</head>
<body>
</body>
<script type="text/javascript">
// var 的情况
console.log(b); // undefined
var b = 2;
// let 情况
console.log(a); // ReferenceError: a is not defined
let a = 1;
</script>
</html>
在示列2中,var声明的变量就发生变量提升,脚本还没运行,变量b就已经存在输出underfined。而用let命令的变量就不会发生变量提升,如果提前用到就会报错。
3.在相同作用域下不能声明相同的变量。
示列3:
在示列3中,不能在函数内部重复声明参数,声明的参数也不能与形参同名。如果声明的参数在另外一个作用域下,则可以重复声明。
4.for循环体中let的父字作用域
示列4:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>for循环中let命令</title>
</head>
<body>
<button>点击0</button>
<button>点击1</button>
<button>点击2</button>
<button>点击3</button>
<button>点击4</button>
</body>
</html>
<script type="text/javascript">
var btns = document.querySelectorAll(‘button‘);
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function(){
console.log("这是点击"+ i); // 这是点击5
}
}
</script>
在示列4中,不管点击啥,最后打印输出都是点击5,这是为啥呢?因为for是同步操作,而for循环内部的函数执行的是异步操作,当函数找不到I时,便会往上作用域找,所以i的值是5,打印出来的都是“这是点击5”
下面示列5用let命令是如何解决这个问题的:
原文:https://www.cnblogs.com/wzw-gjh/p/12883431.html