let 和 const 关键字
let 关键字
let 关键字的作用:
js
用于创建变量,代替 var 关键字
let 变量名 = value;
let 关键字声明的变量与 var 关键字声明的变量有哪些区别:
js
1. let 创建的变量不能重复声明
2. let 创建的变量不会提升
3. let 创建的全局变量不是全局对象的属性
4. let 创建的变量除了具有全局作用域、函数内作用域,还具备块级作用域
块级作用域:大括号{}内的作用域。
{}代表对象,
js
// 2. let 创建的变量不会提升
console.log(age); //undefined
// console.log(address);
// 创建变量
let address = '上海';
var age = 100;
let func = function(){};
// 1. let 创建的变量不能重复声明
// let address = '北京'; 报错
var age = 200;
// let age = 300; 报错
// var address = '北京'; 报错
// 3. let 创建的全局变量不是全局对象的属性
console.log(window.age); //200
console.log(window.address); //undefined
const 关键字
const 关键字的作用:
js
用于创建变量,const 创建的变量值不能修改,const 创建的变量也可以称为常量
const 常量名 = value;
语法规范:建议常量名全部使用大写
变量的值:内存中地址,栈中的数据。
变量的属性:堆中的数据。
const 声明的变量与 let 声明的变量的区别:
js
let 声明的变量,不能重复声明,但可以修改值
const 声明的变量,不能重复声明,也不能修改值
const 声明的变量也具备 let 声明的变量的 4 个特点:
js
1. const 创建的变量不能重复声明
2. const 创建的变量不会提升
3. const 创建的全局变量不是全局对象的属性
4. const 创建的变量除了具有全局作用域、函数内作用域,还具备块级作用域
块级作用域
const let 创建的变量除了具有全局作用域、函数内作用域,还具备块级作用域
js
1. 分支语句、循环语句等带有 {} 的语句可以产生块级作用域
2. let 声明的变量、const 声明的常量,可以具有块级作用域
js
// 条件语句
if () {}
// switch语句
switch () {}
// for / while循环语句
for () {}
while () {}
do {} while();
// try...catch语句
try () catch (err) {}
// 单大括号
{}
创建的变量除了具有全局作用域、函数内作用域,还具备块级作用域
js
产生块级作用域的情况?
① 大括号中let声明的变量
② 分支结构中
② 循环结构中
块级作用域:大括号{}作为 作用域。
js
{}在ES5中代表对象:属性名+值的形式
{}在ES6中也可以代块级作用域
分支结构和循环结构也能创建块级作用域
var创建的只要不是在函数内,都是全局作用域
let 分支结构和循环结构也能创建块级作用域
js
// 获取li的集合,每个li监听个事件
// 使用var创建的变量是全局变量,在for循环过程中,给5个li添加了监听事件
// 当每个li在调用时,console.log输出的i,在回调函数内没有定义,就找到了全局变量中i
// 这时全局变量的i已经是for循环结束的值,i=5,所以每次单机事件的值都是最后一次事件。
var liBoxs = document.querySelectorAll('li');
for (var i = 0; i < liBoxs.length; i ++) {
liBoxs[i].onclick = function() {
console.log(i);
}
}
// 获取li的集合,每个li监听个事件
// 使用let创建的变量是块级变量,在for循环过程中,给5个li添加了监听事件
// 每个li都放在块级作用域中,每个块级作用域中的i的值都不一样。
// 当单机事件被调用时,回调函数使用上层作用域{块级作用域}i的值就不一样。
var liBoxs = document.querySelectorAll('li');
for (let i = 0; i < liBoxs.length; i ++) {
liBoxs[i].onclick = function() {
console.log(i);
}
}
// 条件语句
if () {}
// switch语句
switch () {}
// for / while循环语句
for () {}
while () {}
do {} while();
// try...catch语句
try () catch (err) {}
// 单大括号
{}
块级作用域的作用
不用闭包