当前位置:网站首页>闭包(二)
闭包(二)
2022-07-31 05:10:00 【F班的小夏同学】
闭包这个神奇的东西,现在的定义已经多到大家不知道怎么理解了,今天我们梳理一下各种版本的定义。
古老定义
闭包,是指函数变量可以保存在函数作用域内,因此看起来是函数将变量包裹起来了。
那这样说来,包含变量的函数就是闭包。
//按照古老定义,包含变量的函数就是闭包。
function foo(){
var n=0;
}
console.log(n)//Uncaught ReferenceError: n is not defined
定义一
闭包是指可以访问其所在作用域的函数。
那这样说来,需要通过作用域链查找变量的函数就是闭包。
//按照定义一的说法,需要通过作用域链在全局环境中查找变量n的函数foo()就是闭包
var n = 0;
function foo() {
console.log(n)//0
}
foo();
定义二
闭包是指有权访问另一个函数作用域中的变量的函数
那这样说来,访问上层函数的作用域的内层函数就是闭包。
//按照定义二的说法,嵌套在foo函数里的bar函数就是闭包
function foo(){
var a = 2;
function bar(){
console.log(a); // 2
}
bar();
}
foo();
定义三
闭包是指在函数声明时的作用域以外的地方被调用的函数。
在函数声明时的作用域以外的地方调用函数,需要通过将该函数作为返回值或者作为参数被传递。
- 返回值
//按照定义三的说法,在foo()函数的作用域中声明,在全局环境的作用域中被调用的bar()函数是闭包
function foo(){
var a=2;
function bar(){
console.log(a)//2
}
return bar;
}
foo()();
可以简写成如下表示:
function foo(){
var a=2;
return function (){
console.log(a);//2
}
}
foo()();
- 参数
//按照定义三的说法,在foo()函数的作用域中声明,在bar()函数的作用域中被调用的baz()函数是闭包。
function foo(){
var a=2;
function baz(fn){
console.log(a);//2
}
bar(baz);
}
function bar(fn){
fn();
}
因此,无论通过何种手段,只要将内部函数传递到所在的作用域以外,他都会持有对原始作用域的引用,无论在何处执行这个函数都会使用闭包。
IIFE
IIFE是不是闭包?
foo()函数在全局作用域定义,也在全局作用域被立即调用,如果按照定义一的说法来说,他是闭包。如果按照定义二和定义三的说法,他又不是闭包。
var a=2;
(function foo(){
console.log(a);//2
})()
还有一个重要的原因,在requireJS出现之前,实现模块化编程主要通过IIFE,而在IIFE中常见的操作就是window.fn=fn来暴露接口,而这个fn就是闭包,而IIFE只是另一个包含闭包的函数调用。
(function(){
var a = 0;
function fn(){
console.log(a);
}
window.fn = fn;
})()
fn();
最后:
严格来说, 闭包需要满足三个条件,
- 访问所在作用域
- 函数嵌套
- 在所在作用域外被调用
边栏推荐
- Distributed Transactions - Introduction to Distributed Transactions, Distributed Transaction Framework Seata (AT Mode, Tcc Mode, Tcc Vs AT), Distributed Transactions - MQ
- 数据库学习笔记
- 【MySQL8入门到精通】基础篇- Linux系统静默安装MySQL,跨版本升级
- C语言实验四 循环结构程序设计(一)
- [mysql improves query efficiency] Mysql database query is slow to solve the problem
- 如何将项目部署到服务器上(全套教程)
- 第7章 网络层第1次练习题答案(第三版)
- 数据集划分以及交叉验证法
- If the account number or password is entered incorrectly for many times, the account will be banned.
- 剑指offer基础版--- 第23天
猜你喜欢
账号或密码多次输入错误,进行账号封禁
About the problems encountered by Xiaobai installing nodejs (npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)
Swordsman Offer Special Assault Edition ---- Day 6
MySQL(更新中)
Unity mobile game performance optimization series: performance tuning for the CPU side
三子棋讲解(C语言)
C语言实验三 选择结构程序设计
剑指offer专项突击版 --- 第 4 天
剑指offer基础版--- 第23天
有了MVC,为什么还要DDD?
随机推荐
Linux的mysql报ERROR 1045 (28000) Access denied for user ‘root‘@‘localhost‘ (using password NOYSE)
账号或密码多次输入错误,进行账号封禁
110 MySQL interview questions and answers (continuously updated)
Goodbye to the cumbersome Excel, mastering data analysis and processing technology depends on it
Refinement of the four major collection frameworks: Summary of List core knowledge
关于superset集成到自己的项目中
数据库上机实验5 数据库安全性
a different object with the same identifier value was already associated with the session
梳理一下自己常用的快捷键
Shell重油常压塔模拟仿真与控制
数据库学习笔记
Typec手机有线网卡网线转网口转接口快充方案
Swordsman Offer Special Assault Edition ---- Day 6
2022-07-30:以下go语言代码输出什么?A:[]byte{} []byte;B:[]byte{} []uint8;C:[]uint8{} []byte;D:[]uin8{} []uint8。
matlab simulink欠驱动水面船舶航迹自抗扰控制研究
Sword Point Offer Special Assault Edition ---- Day 1
【JS面试题】面试官:“[1,2,3].map(parseInt)“ 输出结果是什么?答上来就算你通过面试
pytorch中的一维、二维、三维卷积操作
Temporal线上部署
wpf ScrowViewer水平滚动