闭包的特点:
1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
作用:延长变量的生命周期,还有变量的访问权限
function hq() {
let Q = 0;
function HQ() {
console.log(Q++);
}
setInterval(HQ,1000)
}
hq();
闭包的用途:
匿名自执行函数:
除了每次使用变量都是用var关键字外,我们在实际情况下经常遇到这样一种情况,即有的函数只需要执行一次,其内部变量无需维护,比如UI的初始化,那么我们可以使用闭包。
对象的增删改查:
// 对象存储的是一个复杂数据类型,以键值对的形式存储多个数据
let fn = {
name:'张',
skill:'佐菲射线',
age:19,
}
// 增删改查
// console.log(fn.skill);
// fn.name='黄';
// console.log(fn);
// delete fn.skill;
// console.log(fn);
// fn.happy = 'smile';
// console.log(fn);
// for循环:for(let i =0;i<arr.length,i++){arr[i]}
// 遍历对象:for(let key in 对象名){}
for(let key in fn){
console.log(key);
console.log(fn[key]);
}
作用域:
1、全局作用域
全局作用域是程序最外层的作用域,它会持续存在。某些情况下也可以理解为windows对象。全局作用域具有以下特点:
全局作用域的变量在任何地方都能访问到
全局作用域是作用域链的最顶端
2、局部作用域
局部作用域一般指的是函数作用域,函数作用域只有在函数定义时才会创建,函数执行结束作用域将销毁。局部作用域具有以下特点:
函数作用于内的变量外部无法直接访问
只有在函数开始执行后才开始创建函数作用域
for(let i =0 ;i<=6;i++){
console.log(i);
}
// console.log('循环内部函数'+i);//i is not defined
块级作用域只可在作用域内部执行
// 全局作用域
var a= 1;
var b = [];
function getA(){
var c= {};
d = 3;
}
getA();
3、块级作用域
块级作用域是ES6发布后出现的一个标准。需要借助let与const实现。
- 块级作用域内的变量在外部是无法访问的
{ //这不算块级作用域,因为在外部能访问a; var a= 2; } console.log(a) //2 { // 块级作用域 let b = 3 } console.log(b) // 报错
作用域链
-
作用域链就是变量在查找取值过程中遍历的一个链条。遵循以下流程:
1,在自身作用域内查询变量,找到即停止查询
2,自身作用域内未查找到,像上次作用域查询,查询有结果即停止查询,无结果继续向上查询
…重复上述步骤
3,直至查询到全局作用域,全局作用域内若也无法查询到变量,则返回undefined
4,作用域链是向上查找的
修改作用域链的方式
1、call()
、apply()
、bind()
他的原理是通过修改this
指向修改作用域链。 -
2、
try{}catch(){}
中的catch
块
3、with
(不推荐)function getName(){ console.log(this.name) } var obj = { name:"csdn" } getName().apply(obj) // apply绑定后就暂时将getName的上级作用域修改为了obj,在原有的getName-->全局作用域间加了一环==> getName-->obj-->全局作用域