我最近面试了一个入门级web开发人员职位的应聘者,并问了这样一个问题:您可以用JavaScript将下面的代码行称为什么:
let foo = function() {}
这个问题故意含糊不清,因为简历很弱,我想通过所有可能的答案来了解应聘者是如何工作的。过了一会儿,回答基本上是“我不知道,正确的答案是什么?”
我解释了有这么几个答案:变量声明,函数赋值,提升缓解,ES6等等,然后我说也可以认为是闭包。对此,候选人回答说:“我不认为这是一个闭包。闭包是函数中的函数。”
这是我第一次有候选人质疑我对一个他们不知道答案的问题的回答,这让我怀疑一个结论是否可以归结为一个简单的句子。我说错了吗?
编辑:此仅供本人学习,与应聘者无关。事实上,我们提出了一个报价,他们接受了。他们下周开始:)
它不是一个闭包--它只是一个“匿名”函数。但是,给出的理由是不正确的。
它不是闭包,因为它没有建立到外部作用域中变量的词法绑定。变量绑定本身不必是可变的--尽管大多数闭包(在JavaScript中)采用变量重新分配。
下面是一个最小有效的闭包。请参阅其他答案中给出的引用和链接,因为这仅仅是一个评论的摘录:
let a = 1
let f = () => a
这是一个闭包,因为建立了一个词法绑定。不需要辅助功能。EOD/QED。
闭包中捕获的变量(a)可以引用可变对象。它也可以简单地写在一个循环中,其中的字母为having(loop)block scope。任何时候都不需要捕获的变量本身是可重新分配的(甚至是可变的):参考Haskell和Java闭包。
下面是使用“let”的循环中闭包的一个很好的例子:https://wesbos.com/for-of-es6/注意,建立闭包不需要辅助函数(这与早期的ECMAScript版本有很大的不同)。
https://en.wikipedia.org/wiki/closal_(Comuter_Programming)#Anonymous_Functions
闭包这个术语经常被用作匿名函数的同义词,尽管严格地说,匿名函数是一个没有名称的函数文本,而闭包是一个函数的实例,一个值,其非局部变量被绑定到值或存储位置(取决于语言;请参阅下面的词汇环境部分)。
它是一个匿名函数,分配给一个块范围的变量,我想它可以被认为是一个闭包,如果它在一个块中。
我认为我们可以同意,一个函数不一定要在另一个函数中定义才能成为闭包。我可能会跟进问他们为什么认为这是结束的必要条件,然后把谈话引向一般的范围。
对于什么是真正的闭包,人们可能会有不同的看法,但我喜欢维基百科中的描述(以前它更广泛一些),每当我教JavaScript时,我都会用到它:
在操作上,闭包是将函数与环境一起存储的记录。
我喜欢它是因为它是一个非常容易理解的描述,并且它很容易应用于JavaScript函数,因为这正是规范中描述的它的工作方式。规范甚至使用术语闭包来指代创建的函数,而不管函数的实际内容如何。
按照这个思路,JavaScript中的每个函数都是闭包,所以您是对的。
话虽如此,我可以看到有人提出这个函数不用作闭包的论点,因为它不访问任何自由变量。
我还必须补充一点,“闭包”不会是我在查看这段代码时首先想到的事情。将存在的事物与不存在的事物命名(指函数不能用作闭包)更容易。
首先想到的是函数表达式。
问题内容: 我知道JavaScript中的每个函数都是一类对象,并且它具有内部属性[[scope]],该属性承载该函数的自由变量的绑定记录。但是,有两种特殊情况。 由Function构造函数创建的函数也是闭包吗?由函数构造函数创建的函数对象是特殊的,因为其[[scope]]可能不引用其外部函数的词法环境,而仅引用全局上下文。例如, 这是不直观的。这也称为关闭吗? 如果内部函数没有任何自由变量,我们
问题内容: 因此,可以说用户在与应用程序服务器不同的时区中通过其浏览器运行我的Web应用程序。我使用JavaScript的方法在客户端序列化日期。我通过Json发送产生的毫秒数,然后通过调用在服务器端创建Java Date对象。我将其存储在MySql上,检索它,通过调用Java 再次将其序列化,然后通过Json将其再次发送给客户端。 如果我用这些毫秒创建一个JavaScript Date对象,它将
这是一个简单的程序,生成0到1000之间的两个随机数,然后让用户输入两个数字的和。即使您输入了正确的答案,并且求和与答案匹配,if语句也总是计算为不正确。
最近,一位同事展示了这段JavaScript代码: 这是怎么工作的?为什么这种行为在浏览器中是可能的,为什么Node.js会自动格式化它?
问题内容: 我在这里阅读了问题:将新值分配给方法参数是否有问题?。但是我不清楚是否做类似的事情: 要么: 这基本上只是为了避免声明一个新的局部变量,这值得吗?这被视为不好的做法吗? 问题答案: 这是一个坏习惯。您将很难找到牺牲可读性值得的方案。对于不了解Java的“按价值传递”策略的人来说,这尤其令人困惑,可悲的是很多人。
问题内容: 我有一个Android应用程序(java),当使用android.provider.Contacts类中的以下代码与Android 1.6 SDK一起编译时,可以正常工作: 2.0 SDK发布后,android.provider.Contacts类被弃用,并替换为android.provider.ContactsContract。为了使一个程序可以同时在1.6和2.0上运行,我在1.6
我正在看宣传单。 在setTimeout中调用
问题内容: 这是一个设计问题,未提交具体代码来保护我的底部。 使用Hibernate时,标准工作流程如下: 公开会议 开始交易 做生意(读取和修改数据) 提交交易 闭幕会议 可能会重复2-4次。 Session.clear()的合理用例是什么? 答:我遇到的具体问题是一段(大型)代码,该代码可以加载和修改实体,然后清除()会话,实质上是丢弃所做的更改。(要完成的业务任务不包括修改实体,因此代码“有