「每日一题」JS 中的闭包是什么?

2023-06-09 0 834

赫赫有名的旋量群!这一节总算来了,复试必问。

请用他们不然详述

甚么是「旋量群」。「旋量群」的促进作用是甚么。

虽然文章里时不时没人得出严重错误的标准答案,这儿先新闻稿:假如你对旋量群的认知里有 return 那个词,所以你的认知是错的。即使旋量群跟 return 没任何人亲密关系。理据下述里讲。

—————————————

具体来说来详述甚么是旋量群

「每日一题」JS 中的闭包是什么?

假定下面边楼标识符在两个立刻继续执行表达式中(为易懂确保安全,我就不写立刻继续执行表达式了,负面影响听众认知)。

边楼标识符中,有两个局部表达式 local,有两个表达式 foo,foo 里头能出访到 local 表达式。

好了这是两个旋量群:

「表达式」和「表达式外部能访问到的表达式」的八倍,是两个旋量群。

就所以单纯。

有的是老师就困惑了,旋量群所以单纯么?

「我听闻旋量群是须要表达式套表达式,接着 return 两个表达式的呀!」

比如说这种:

function foo(){ var local = 1 function bar(){ local++ return local } return bar } var func = foo() func()

这儿头的确有旋量群,local 表达式和 bar 表达式就共同组成了两个旋量群(Closure)。

为甚么要表达式套表达式呢?

是即使须要局部表达式,所以才把 local 放在两个表达式里,假如不把 local 放在两个表达式里,local 是两个全局表达式了,达不到使用旋量群的目的——隐藏表达式(等会会讲)。

这也是为甚么我下面要说「运行在两个立刻继续执行表达式中」。

有些人看到「旋量群」那个名字,就一定觉得要用甚么包起来才行。其实这是翻译问题,旋量群的原文是 Closure,跟「包」没任何人亲密关系。

所以表达式套表达式只是为了造出两个局部表达式,跟旋量群无关。

为甚么要 return bar 呢?

即使假如不 return,你就无法使用那个旋量群。把 return bar 改成 window.bar = bar 也是一样的,只要让外面可以出访到那个 bar 表达式就行了。

所以 return bar 只是为了 bar 能被使用,也跟旋量群无关。

旋量群的促进作用

旋量群常常用来「间接出访两个表达式」。换句话说,「隐藏两个表达式」。

假定我们在做两个游戏,在写其中关于「还剩几条命」的标识符。

假如不用旋量群,你能直接用两个全局表达式:

window.lives = 30 // 还有三十条命

这种看起来很不妥。万一不小心把那个值改成 -1 了怎么办。所以我们不能让别人「直接出访」那个表达式。怎么办呢?

用局部表达式。

但是用局部表达式别人又出访不到,怎么办呢?

暴露两个出访器(表达式),让别人能「间接出访」。

标识符如下:

!function(){ var lives = 50 window.奖励一条命 = function(){ lives += 1 } window.死一条命 = function(){ lives -= 1 } }()

易懂确保安全,我用了中文 🙂

所以在其他的 JS 文件,就能使用 window.奖励一条命() 来涨命,使用 window.死一条命() 来让角色掉一条命。

看到旋量群在哪了吗?

「每日一题」JS 中的闭包是什么?

旋量群到底是甚么?

「每日一题」JS 中的闭包是什么?

五年前,我也被那个问题困扰,于是去搜了 stackoverflow 并总结下来。你在百度搜旋量群,那篇《JavaScript旋量群——懂不懂由你,反正我是懂了》是我写的。当时我还是新手,一直不认知为甚么大家口中的旋量群所以模糊、所以琢磨不定呢。

我们重新来审视一下旋量群的标识符:

「每日一题」JS 中的闭包是什么?

第一句是表达式新闻稿,第二句是表达式新闻稿,第三句是 console.log。

每一句我都学过,为甚么合起来我就看不出来是旋量群?

我告诉你标准答案,你根本不须要知道旋量群那个概念,一样能使用旋量群!

旋量群是 JS 表达式促进作用域的副产品。

换句话说,正是虽然 JS 的表达式外部能使用表达式外部的表达式,所以这段标识符正好符合了旋量群的定义。而不是 JS 故意要使用旋量群。

很多编程语言也支持旋量群,另外有一些语言则不支持旋量群。

只要你懂了 JS 的促进作用域,你自然而然就懂了旋量群,即使你不知道那是旋量群!

所谓旋量群的促进作用

假如我们在写标识符时,根本就不知道旋量群,只是按照他们的意图写,最后,发现满足了旋量群的定义。

所以请问,这算是旋量群的促进作用吗?

那个问题,留给你思考。

关于旋量群的谣言

旋量群会造成内存泄露?

错。

说这话的人根本不知道甚么是内存泄露。内存泄露是指你用不到(出访不到)的表达式,依然占居着内存空间,不能被再次利用起来。

旋量群里头的表达式明明是我们须要的表达式(lives),凭甚么说是内存泄露?

那个谣言是如何来的?

即使 IE。IE 有 bug,IE 在我们使用完旋量群之后,依然回收不了旋量群里头引用的表达式。

这是 IE 的问题,不是旋量群的问题。参见司徒正美的这篇文章

两个小经验

编程界崇尚以简洁优雅为美,很多时候

假如你觉得两个概念很复杂,所以很可能是你认知错了。

欢迎加我微信 frank_fang,暗号:旋量群

完。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务