你不了解的JS笔记 - 作用域闭包

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行的

无论通过何种手段将内部函数传递到所在的词法作用域以外,它都会持有对原始定义作用域的引用,无论在何处执行这个函数都会使用闭包

只要使用了回调函数,实际上就是在使用闭包

一个需要调用的函数引用了其他作用域的变量,导致该作用域不会消失,并且函数可以随时引用这个作用域

for (var i = 1; i < 5; i++) {
  (function (j) {
    setTimeout(function () {
        console.log(j); 
    }, j * 1000);
  }(i))
}

在迭代内使用IIFE会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代内部,每个迭代中都会包含有一个具有正确值的变量供我们访问!!!!!

for循环头部的let声明有一个特殊行为:变量在循环过程中不止被声明一次,每次迭代都会声明。随后的每个迭代都会使用上一个迭代结束时的值来初始化这个变量


最常见的实现模块模式的方法通常被称为模块暴露

模块模式需要具备两个必要条件:

  • 必须有外部的封闭函数,该函数必须至少被调用一次,每次调用都会创建一个新的模块实例
  • 封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态

模块模式一个简单但强大的用法是命名将要作为公共API返回的对象

模块模式的两个特点:调用包装了函数定义的包装函数,并且将返回值作为该模块的API

基于函数的模块并不是一个能被静态识别的模式,可以在运行时修改一个模块的API,ES6模块API是静态的,编辑器可以在编译器检查对导入模块的API成员的引用是否真实存在,而不会等到运行期再动态解析

ES6模块没有行内格式,必须被定义在独立的文件中,模块中的内容会被当做好像包含在作用域闭包中一样来处理

posted @ 2025-06-02 21:02  永生辉皇  阅读(7)  评论(0)    收藏  举报