通过本篇博客,你会了解到JS作用域,闭包使用场景等知识点
1. 作用域
全局作用域:典型的全局作用域,window对象
函数作用域:作用在函数内部,仅在函数内部可访问,当函数执行完毕后会直接被销毁。var声明的是函数作用域。
ES6块级作用域:用let声明的变量就是块级作用域,存在暂时性死区问题(在定义之前不能使用),常常存在于if、for语句中。
console.log(name);
let name = "wyy"
console.log(name);
var name = "wyy"
2. 闭包
定义:
闭包是指有权访问另外一个函数作用域中的变量的函数
闭包的本质:
当前环境中存在父级作用域的引用
闭包的表现形式:
1.返回一个函数
2.定时器、事件监听、ajax等只要使用了回调函数都会产生闭包
3.以函数作为参数进行调用
4.IIFE(及时执行的匿名函数 )
闭包的缺点:
函数执行完以后,函数内的局部变量未释放,占用内存时间变长
容易造成内存泄漏
3.应用场景
解决了循环输出:
解决方式:
- let关键字
for(let i = 1;i<=5;i++){
setTimeout(()=>{
console.log(i);
},0)
}
- setTimeout设置第三个参数
for(var i = 1;i<=5;i++){
setTimeout(function(j){
console.log(j);
},0,i)
}
- 第三种方式
for(var i = 1;i<=5;i++){
(
function(j){
setTimeout(function() {
console.log(j);
}, 0);
}
)
}
最简单的还是使用let关键字,声明块级作用域。