1.什么是闭包?
函数嵌套,内函数使用外函数定义的变量。
在内函数还在使用外函数的变量时值不会被释放。
(具有作用域的代码块=闭包)
优点/应用场景:
- 变量不能通过外部访问,只能通过调用函数访问
- for循环之类可能需要临时保存一下i值,后续继续使用(业务延时)
- 防止变量污染,把变量放在局部作用域
- 封装好方便对象共用闭包工具
(全局)变量污染
出现场景:
- 全局变量的定义冲突(两个不同的地方定义了同名但不同作用的全局变量)
- 更改全局变量但没有照顾到全局(有没能跟随变化的地方)
解决方法:
- 少用全局变量,多用局部变量
- 在一个统一的地方写全局变量
- 每次更改完全局变量进行检查
- 使用严格模式(严格模式下函数不能使用相同命名的变量)
2.var let const的区别
var | let | const | |
作用域 | 函数级 | 块级 | 块级 |
变量提升 (暂时性死区反过来) | 存在 (未声明报undefined) | 不存在 (报错) | 不存在 (报错) |
全局属性 | 会变为全局对象的属性 | 不会 | 不会 |
可重复声明 | 是 | 否 | 否 |
初始值 | 不需要 | 不需要 | 需要 |
指针指向(重新赋值) | 可以 | 可以 | 不可以 |
变量提升:在声明前就能使用
块级作用域:{}内,比如循环内部或者if条件内部
关于全局对象:
浏览器的全局对象是window。
3.抛出err的两种方法
throw new Error("这是报错信息");
try {
// 可能会抛出错误的代码
} catch (error) {
console.error(error.message); // 输出捕获到的错误信息
}