这真的被认为是一个javascript闭包吗?[duplicate]

ghhaqwfi  于 2023-02-07  发布在  Java
关注(0)|答案(4)|浏览(134)
    • 此问题在此处已有答案**:

Is it true that every function in JavaScript is a closure?(2个答案)
三年前关闭了。
我最近面试了一个初级网页开发人员职位的候选人,问了这个问题:下面这行代码在Javascript中叫什么?

let foo = function() {}

这个问题故意含糊其辞,因为简历很弱,我想了解一下应聘者是如何处理所有可能的答案的。过了一会儿,应聘者的回答基本上是"我不知道,正确答案是什么?"
我解释说,有几个答案:变量声明、函数赋值、提升缓解、ES6等,然后我说也可以认为是闭包,对此考生回应"我不认为那是闭包,闭包是函数中的函数。"
这是我第一次遇到一个候选人质疑我对一个他们不知道答案的问题的回答,这让我想知道,是否可以把一个结束归结为一个简单的一行程序。我错了吗?
编辑:这只是为了我自己的学习,与应聘者无关,事实上我们延长了一个报价,他们接受了,他们下周开始:)

zujrkrfu

zujrkrfu1#

我想我们都同意一个函数不一定要在另一个函数中定义才是闭包,我可能会跟进并问他们为什么认为这是闭包的一个要求,然后将对话引向一般的作用域。
人们可能对闭包的真正构成有不同的看法,但我喜欢Wikipedia中的描述(它曾经更广泛一些),我在教JavaScript时一直使用它:
从操作上讲,闭包是一个记录,它将功能与环境存储在一起。
我喜欢它,因为它是一个非常容易理解的描述,而且它很容易应用于JavaScript函数,因为这正是规范中描述的工作方式。规范甚至使用术语 * 闭包 * 来指代创建的函数,而不管函数的实际内容如何。
按照这个思路,JavaScript中的每个函数都是闭包,所以你是对的。
话虽如此,我可以看到有人提出这个函数不作为闭包使用,因为它不访问任何自由变量。
我还必须补充一点,“闭包”不是我看到这段代码时首先想到的东西,命名存在的东西和不存在的东西更容易(指函数不能用作闭包)。
我首先想到的是 * 函数表达式 *。

toe95027

toe950272#

https://en.wikipedia.org/wiki/Closure_(computer_programming)#Anonymous_functions
术语闭包经常被用作匿名函数的同义词,尽管严格地说,匿名函数是一个没有名字的函数文本,而闭包是一个函数的示例,一个值,它的非局部变量已经被绑定到值或存储位置(取决于语言;参见下面的词法环境部分)。
它是一个匿名函数,赋值给了一个块作用域变量,我想如果它在一个块中,它可以被认为是一个闭包.

hujrc8aj

hujrc8aj3#

它不是一个闭包--它只是一个“匿名”函数。然而,* 给出的理由是不正确的。*
它不是一个闭包,因为它没有建立与外部作用域中变量的词法绑定。变量绑定本身不需要是可变的--尽管大多数闭包(在JavaScript中)使用变量重新赋值。
下面是一个最小有效闭包。参见其他答案中的引用和链接,因为这仅仅是一个注解的摘录:

let a = 1
let f = () => a

这是一个闭包,因为建立了词法绑定。不需要辅助函数。EOD/QED。
闭包中捕获的变量(a)可以引用一个可变的对象,也可以写在一个循环中,let具有(loop)块作用域,任何时候都不要求捕获的变量本身是可重分配的(甚至是可变的):参见Haskell和Java闭包。
下面是循环中使用“let”的闭包的一个很好的例子:https://wesbos.com/for-of-es6/注意,建立闭包不需要辅助函数(这与早期的ECMAScript版本有很大的不同)。

js4nwp54

js4nwp544#

如果你想考虑任何类型的函数都可以被认为是闭包,那么使用一个同名的术语来谈论函数有什么意义呢?尤其是如何区分这种为保护其内容而进行的特定类型的编码?

采购订单问题:"最小有效闭包",我可以做 * 目前 *
答案:* MisterJojo好的谢谢,你能给我一个最小有效闭包的例子吗?-Jeffrey Barrett *

// prepared  logic for specific closures functions
const fCount=_=>{let x=0;return _=>x++}

// closures functions :
let myCount = fCount()
let yourCount = fCount()

// proofs of ... 
console.log( 'my', myCount() )  // 0
console.log( 'my', myCount() )  // 1
console.log( 'my', myCount() )  // 2

console.log( 'your', yourCount() )  // 0
console.log( 'your', yourCount() )  // 1
console.log( 'your', yourCount() )  // 2
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {min-height:100% !important; top:0;}

fCount是"已关闭"=〉无法访问其"x"。

    • 这就是为什么我们称这种函数代码为"闭包"**(在JS中没有私有变量)

相关问题