问题标签 [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 投票
9 回答
40264 浏览

python - lambda函数及其参数的范围?

我需要一个与一系列 gui 事件几乎完全相同的回调函数。根据调用它的事件,该函数的行为会略有不同。对我来说似乎是一个简单的案例,但我无法弄清楚 lambda 函数的这种奇怪行为。

所以我在下面有以下简化代码:

这段代码的输出是:

我期望:

为什么使用迭代器会把事情搞砸?

我试过使用深拷贝:

但这也有同样的问题。

0 投票
3 回答
169 浏览

javascript - 在javascript中可以进行这种范围界定吗?

我正在开发一个 javascript 框架。我有几个看起来像这样的独立脚本:

这个函数是从另一个外部脚本调用的。我正在尝试将变量传递给此函数,以便可以访问它们without using the this keyword.

上面的例子会出错,说 wot 是未定义的。

如果我将函数包装在一个匿名函数中并在那里声明变量,我会得到预期的结果

我要做的是在作用域链的上游声明变量,以便可以在模块中访问它们,而无需像第二个示例那样使用 this 关键字。我不相信这是可能的,因为看起来函数执行范围在函数声明时是密封的。

update
为了澄清我试图定义 wot 的位置。在一个单独的 javascript 文件中,我有一个像这样调用注册模块函数的对象

0 投票
1 回答
621 浏览

lisp - 对宏的词法闭包?

有没有办法使用宏来做类似词法闭包的事情?我想要做的是使以下宏成为本地递归助手,它在每个组合上调用一个函数,而不是像现在在 repl 结果中调用宏那样生成一个列表:

我想要的是一个宏,它接受一个函数和任意数量的列表,并导致嵌套循环在每个组合上调用该函数。我对 lisp 很陌生,这是我编写的第一个宏,超越了 'nif' 克隆等,因此任何建议都值得赞赏。

我试图将宏转换为宏中的宏,该宏需要一个函数,并且行 '(nreverse (list ,item ,@vars))' 被替换为 '(func (nreverse (list ,item ,@vars) ))' 但我收到错误消息说 func 是一个未定义的变量或函数。

这是原始功能:

这就是我用宏程序尝试过的并得到未定义的函数'func'错误。

0 投票
4 回答
523 浏览

javascript - javascript 柯里化

我正在尝试创建可应用于任何函数并返回另一个函数的curry 函数,其中应用了 1 个参数。我想拥有的属性:

  1. 如果函数只有一个参数,curry 函数应该返回值:f(a); 咖喱(f,x)= f(x);
  2. 如果函数有很多参数,currey 应该重新运行 curried 函数:g(a1,a2,..,aN); 咖喱(g,x) = g2(a2,..,aN) : g2(a2,..aN)=g(x,a2,...,aN)
  3. curry 函数的长度属性应该“根据需要”工作 g.length = N => curry(g,x).length = N-1

Prototype Framework 中有一些 curry 的实现,在一篇博客中有讨论。但是这种实现并不好,因为它不适用于只有一个参数 (1) 的函数,并且返回函数“长度”属性为 0 (3)。

对于第一个属性,有一个简单的实现:

但我不知道如何使用第三条规则,即函数可以构造为内部函数,因为会有一个嵌套的词法环境并且能够使用 f:

但在这种情况下,我将不再能够显式设置参数。另一方面,可以使用“new Function”语句构造函数,就像这样:

但在这种情况下,f 和 x 将解除绑定,因为匿名函数将在全局词法环境中创建。

所以问题:

  1. 有没有办法在使用 function 关键字创建函数时显式设置参数计数?
  2. 有没有办法设置使用“新功能”语句创建的功能环境?
  3. 我们有办法以任何其他方式解决我的问题吗?
0 投票
2 回答
112 浏览

javascript - 变量范围错误(可能需要闭包?)

我有以下需要关闭的代码:

发生的情况是,每当单击一个项目时,预览总是相同的数字

我怀疑我需要做的是

并像这样分配 onclick:

但是以后this不会再引用我的链接了……这个问题是如何解决的?

0 投票
3 回答
268 浏览

python - python关闭奇怪的行为

我正在尝试来自 Python Lexical closures问题中的一段代码

输出是:

不应该吗:

我使用以下代码获得了上述输出:

我正在使用 Python 2.6.6(r266:84292,2010 年 9 月 15 日,15:52:39)。

0 投票
6 回答
48026 浏览

c++ - 我们在 C++ 中有闭包吗?

我正在阅读有关网络关闭的信息。我想知道 C++ 是否有内置的闭包工具,或者是否有任何方法可以在 C++ 中实现闭包?

0 投票
3 回答
161 浏览

c++ - 使用 lambda 函数来模拟 lexical clousures 是否有不可预见的性能/实现问题?

方案一:

函数 Hello() 和 World() 存在于全局命名空间中。
这意味着它们可以被声明之后的任何其他函数调用(或者在这种情况下,我提供了定义并且不需要先声明)。

我有一个问题,因为随着我的项目变得越来越大,我包含了更多的头文件,这些头文件用很多函数填充了全局命名空间,并且我冒着函数签名冲突的风险,或者更糟糕的是,不小心调用了应该只调用的错误函数作为另一个功能的子任务。

我试图遵循将任务功能分解为子任务的范式,因此在另一个特定函数的范围之外调用特定函数是没有意义的。

这是一种解决方法,除了由于缩进深度导致代码变得不可读之外,我想知道是否存在任何性能或实现问题。lambda 函数目前对我来说有点神奇,所以我对不可预见的危险感到好奇。

方案二:

Hello() 和 World() 被封装在 main() 内部,不能从 main() 的作用域之外调用。
这就是不一样的一切吗?

0 投票
4 回答
2252 浏览

c++ - 如何使一个函数只能从另一个函数调用?

确保func_SubA()只能在func_A()内部调用的最佳方法是什么?如果 func_B ()尝试调用func_SubA()
,我想收到编译器错误。

0 投票
4 回答
2071 浏览

lisp - Emacs lisp:为什么这个 sexp 会导致无效函数错误?

有问题的性别是

对我来说,它看起来应该评估为8,并且在其他lisp(例如Racket)中它确实如此,但是在elisp中它会抛出这个错误:

它似乎在告诉我

不是一个有效的函数。这似乎是错误的,因为当我评估该表达式时,我得到

这对我来说看起来像是一个有效的功能。有谁知道为什么会这样?它与动态范围有关吗?