JS-作用域、作用域链、闭包

57 阅读2分钟

作用域

全局作用域:在全局作用域里面的变量称为全局变量
函数作用域:保存在函数作用域内的通过var的变量称为局部变量
局部变量:1、在函数内的变量。2、函数的形参变量

js中没有块级作用域,只有全局作用域和函数作用域,es6里面所谓的块级作用域,底层是匿名函数自调形成的作用域,本质还是函数作用域

作用域链

一个函数既可以用自己作用域的变量,又可以用外层作用域的变量,一个函数可以使用的所有作用域连接起来,就形成了当前函数的作用域链,当执行语句时,js会沿着函数作用域链查找要用的变量

作用域链在定义函数时,就已经有了,而不是在调用时才有的

闭包

一个变量需要重复使用,又不会被外部污染的局部变量

闭包是一个对象,闭包就是每次调用外层函数时,临时创建的函数作用域对象被内层函数作用域链引用着,无法释放,形成了闭包

使用闭包步骤:

  1. 用外层函数包裹要保护的变量和使用变量的内层函数

例:

//第一步
function out(){
    var a = 0
}
  1. 在外层函数内部返回内层函数对象

例:

//第一步
function out(){
    var a = 0
    //第二步
    return function(){
        a+=10
        console.log('a的值为',a)
    }
}
  1. 调用外层函数,用变量接收返回的内层函数

例:

//第一步
function out(){
    var a = 0
    //第二步
    return function(b){
        a+=b
        console.log('a的值为',a)
    }
}
//第三步
var b = out()
b(10)
b(20)

闭包的缺点:极容易造成内存泄漏