问题标签 [lexical-closures]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
16417 浏览

javascript - 使用参数变量获取传递给 ES6 箭头函数的参数

我了解箭头函数在 ES6 中是如何工作的,以及词法 this,但我想知道是否有人知道将参数传递给箭头函数的方法?

在 ES5 中,您可以简单地执行以下操作:

但是,在 ES6 中,如果您使用箭头函数,如下所示:

arguments变量返回一个对象,该对象与参数无关。

所以,我想知道是否有人有办法将参数传递给箭头函数?


编辑

我想也许我应该提供一些关于我正在尝试完成的事情的信息,也许如果上述内容不可能,那么有人有更好的主意。

基本上,我在 BluebirdJS asCallback方法中添加了一个 IIEF,它将确定是否确实提供了回调,如果没有,它将返回承诺。

这是 ES5 中的一个工作示例:

因此,如果我使用所有 ES5 函数,那效果很好,而且我不介意将它们用于 IIEF,或者在需要时在其中使用。但这取决于arguments函数内部的变量,我真的不想用作 ES5 函数,而是坚持使用 ES6 箭头函数。因此,如果有一些 ES6 方法可以在 ES6 箭头函数中获取参数,那将是完美的!

0 投票
3 回答
433 浏览

javascript - Javascript 词法范围

我试图理解词法范围的概念。据我所知,词法范围不能向后工作。在下面的 javascript 代码中,我在 scope3() 函数中声明了变量“名称”。但我试图在 scope1() 和 scope2() 函数中调用它。由于词法范围不能向后工作,我应该得到“名称未定义”,但它返回空字符串。有人可以解释一下吗?

0 投票
3 回答
109 浏览

javascript - 是否可以在 Javascript 中区分非捕获函数和闭包?

两个函数对象:

具有相同的源代码“function(){return k;}”,但它是在全局环境中查找f1的函数,而是捕获本地.kf2k

是否可以判断f2是闭包?typeof因为两者都有"function"帮助,也无济于事......

例如,将函数的源代码存储在数据库中可能是有意义的,因为您可以使用eval. 由于捕获的变量,存储闭包的源代码是行不通的。

0 投票
1 回答
3398 浏览

swift - 使用 NSUndoManager,如何使用 Swift 闭包注册撤销

我正在尝试了解如何NSLayoutManager使用 Swift 闭包。我可以成功注册undo如下:

当然,我需要支持redo相当于撤销的撤销。我可以这样做:

但现在我需要支持撤销重做......嗯......好的:

如您所见,它的“乌龟一路向下”。我该如何摆脱这种疯狂?即,在我能找到的所有示例代码中,人们使用代码的选择器版本来注册一种可以自行撤消的方法——这显然不适用于我正在使用的闭包方法......如何使用闭包版本并获得无限撤消/重做?

0 投票
2 回答
300 浏览

lambda - Racket using lexical closures

I read in Let over Lambda about lexical clojures and this code sample was given for Common Lisp:

I tried writing this in Racket as:

When I call it in the REPL as counter it gives me the error:

As far as I understood, mixing let/set with lambda gives you the ability to store in a lambda some state that can be processed by other functions in the same manner that human memory can be processed and changed by the input from the senses. I'm interested in having in my LISP programs parts of code that are changed by their interaction with other function. Even if this isn't done by lambda, I still want to understand it(the lambda function) because it appears to be an important part of Racket and other LISP dialects.

0 投票
1 回答
365 浏览

python - 将方法绑定到对象运行时后期绑定

我知道python循环中的后期绑定,但我找不到解决这个问题的方法。

我尝试过partialfunctools没有成功:(

0 投票
3 回答
1721 浏览

javascript - 嵌套函数、闭包和作用域

我一直在试图围绕范围,特别是闭包。我知道有很多关于这个主题的帖子,而且我已经阅读了很多。但是大多数地方都将主题称为高级,并且使用相对难以掌握的术语。我想绝对确定我的基础知识是正确的,这样我就不会冒险进入更复杂的主题,而对函数的真正工作方式有错误的想法。

所以......我选择了一个基本功能,并且真的希望有人告诉我我认为它在幕后发生事情是否是实际发生的事情。

这是代码:

(我知道它实际上并没有做总和,我对其进行了调整,试图了解每个步骤中发生了什么。)

所以,我的主要疑问是为什么 A 是 1,而不是 2。我得出的结论是,闭包被创建,一旦function(b)被创建sum(2)作为参数,就在被返回之后sum(1)。因此,根据闭包的定义,我假设在创建函数时它还保存了词法环境(其中a = 1)。这是正确的吗?

我已经制作了步骤图。

图表

0 投票
1 回答
1331 浏览

dynamic - OCaml 词法与动态作用域

我对一些话题有疑问。简而言之,我必须在 Ocaml 中编写静态和动态范围的解释器。现在,我通过使用环境(IDE * 值)列表和 eval (evn * exp) 实现了一个具有静态范围的版本,并在语句中传递了 evn。

那么问题和 ' 可以通过更改列表的读取方式来开发具有列表和 eval 函数的范围(动态 - 静态),或者您必须采取其他方式?

这里有一部分代码:

评估代码:

这是我发表声明的一个例子:

或者

有了这些例子,结果是 Int 1。在我的书中,这个例子给出了:

词法:诠释 1

动态:诠释 2

它看起来是一个正确的实现。

0 投票
6 回答
97 浏览

javascript - 这对 JavaScript 函数有何不同?

我很难辨别 JavaScript 闭包是如何工作的。请看一下这两个函数,并说明它们在多次调用时产生完全不同的结果的不同之处:

功能一

功能二

0 投票
0 回答
20 浏览

javascript - 词法范围示例不起作用

为什么这种关闭不起作用?

错误。对此有什么可能的解释?