浅析JS闭包(Closure)与函数的柯里化(Currying)

先上版图


塞尔达 荒野之息
//3月3号老任就要发售Switch了,还有塞尔达护航新作好激动呀,然而我并没有钱买...

1、JS闭包

闭包在程序界是一个很抽象的概念,以至于被人称为编程界的哈姆雷特,我们先来看看MDN对其的解释

Closures are functions that refer to independent (free) variables (variables that are used locally, but defined in an enclosing scope). In other words, these functions 'remember' the environment in which they were created.

  • 闭包是一个函数,特指那些可以访问独立变量的函数(这种独立变量在本地使用,但是却定义在一个封闭的作用域),换句话说这类函数能够记忆创建它们时的环境

其实我个人理解更倾向于:

当嵌套函数的引用传递给了嵌套函数作用域之外的变量,或者对象的属性,此时就会形成一个闭包

嗯,解释的很好,但我还是不知道这是个啥
那还是少废话上代码吧。。

function person() {
  var name = 'ergouzi';
  console.log(name);
}
person();
console.log(name);
输出:
//ergouzi
//undefined

很普通的一个函数,正常理解函数与变量的思维就是:函数执行,定义变量,函数执行完毕,变量销毁。再来看看另一种写法

function person() {
  var name = 'ergouzi';
  var nameFunc = function() {
    console.log(name);
  }
  return nameFunc;
}
var personFunc = person();
personFunc();
输出:
//ergouzi

可以看到,这里即使person函数执行完毕了,但是里面的name变量却没有被销毁,这里再套用开头解释的概念,应该能理解部分了吧。咱们再来验证一下这种“被记忆的独立变量”的特性

function person() {
  var name = 'ergouzi';
  var funcObj = {
    'nameFunc': function () {
      console.log(name);
    },
    'changeFunc': function () {
      name = 'goudanzi';
    }
  }
  return funcObj;
}
var funcObj = person();
funcObj.changeFunc();
funcObj.nameFunc();
输出:
//goudanzi

可以看到,我们在该独立变量的作用域外部改变了它的值,所以说明相同环境里创建的闭包函数,引用的独立变量为同一份拷贝,即同一个对象。其实用chrome调试一下就能很清楚的看到闭包函数长啥样,比如我这里的闭包函数它长这样(还长得挺漂亮的)


我们可以看到两个函数“changeFunc”,“nameFunc”,从他们的Scopes里面都能找到Closure并且创建环境都为person,记忆的独立变量都为“name”,

再来看点哦莫西罗伊的

for (var i = 0; i < 10; i++) {
  setTimeout(function(){
    console.log(i)
  }, 0);
}
输出:
//10
//10
//10
//10
//10
//10
//10
//10
//10
//10
//简要解释一下输出值,因为setTimeout是异步函数,在i=0第一次循环时只是定义了第一个定时函数而并没有执行它,待到执行第一个定时函数,但此时i的值已经变了

一个普通的for循环,每次循环定义了一个定时器函数,因为没有给定时器函数的句柄传参,它只能拿到i最后的值。我们换一种“闭包”一点的写法

for (var i = 0; i < 10; i++) {
  setTimeout(((j) => console.log(j))(i), 0);
}
//或者这样写
for (var i = 0; i < 10; i++) {
  (j => setTimeout((j) => console.log(j), 0))(i);
}

这里用到了es6的箭头函数,想详细了解箭头函数请移步箭头函数
这里的代码将每次循环的i值传给了一个闭包函数,此时这个闭包函数记忆了这个i的值,等到执行定时函数时,就可以正常打印出i值。

参考文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

//未完待续,懒癌犯了剩下的下次补...
//接下来是每周最开心的游戏时间,仁王继续落命中...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代...
    穷人家的孩纸阅读 1,704评论 1 5
  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 1,559评论 0 3
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,361评论 1 5
  • 推开向湖的窗 三月的风涌进来 四月的雨打进来 黑色的思念一直在窗外徘徊 湖面的波闪着行人的眼 湖底的潮低诉着生活的...
    海大宝阅读 127评论 0 1
  • 中政公考(微信号:zzexam) 打造行业更高通过率 在公考笔试中无论是行测还申论,对于措辞的严谨性都有一定的要求...
    newbiefly阅读 340评论 0 1