/*
* let:
* 特点:
* 1.在块作用域内有效;
* 2.不能重复声明;
* 3.不存在预处理(全局预处理,创建全局预处理对象,将
* var定义的变量,放在windows属性上,this绑定为window
* 函数预处理,创建函数预处理对象
* ),不存在变量提升
* const: 定义一个常量
* 特点:
* 1.不能修改
* 2.不存在预处理,和变量提升,
* 3.不能重复声明
* */
// let
console.log(name) //Cannot access 'name' before initialization 初始化前无法访问“name”
let name = 111 //let不存在预处理和提升
var btns = document.getElementsByTagName('button')
for (var i = 0; i < btns.length; i++) {
var btn = btns[i]
btn.onclick = function () {
console.log(i)
}
}
/*点击每次按钮打印的都是3,因为点击事件是一个回调函数,js是单线程,回调函数会被推到回调队列,for循环是同步代码,会先执行,每次点击
按钮,for循环都会循环完执行,才会执行点击事件,所以打印的都是3*/
var btns = document.getElementsByTagName('button')
for (var i = 0; i < btns.length; i++) {
var btn = btns[i]
(btn.onclick = function (i) {
console.log(i)
})(i)
}
/*
* 使用闭包,匿名函数自调用,都会有自己的作用域
* */
var btns = document.getElementsByTagName('button')
for (let i = 0; i < btns.length; i++) {
var btn = btns[i]
(btn.onclick = function (i) {
console.log(i)
})(i)
}
/*
* 使用let块级作用域
* */
// const
console.log(name1) //Cannot access 'name' before initialization 初始化前无法访问“name”
const name1 = '456'
name1 = 123 //不允许被修改
ES6 let,const与var的区别与理解
最新推荐文章于 2024-07-14 15:54:59 发布