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

c# - 在 C# 的循环中捕获的变量

我遇到了一个关于 C# 的有趣问题。我有如下代码。

我希望它输出 0、2、4、6、8。但是,它实际上输出了 5 个 10。

似乎这是由于所有操作都引用了一个捕获的变量。结果,当它们被调用时,它们都具有相同的输出。

有没有办法绕过这个限制,让每个动作实例都有自己的捕获变量?

0 投票
7 回答
32477 浏览

javascript - Javascript 反射

有没有办法从内部获取 javascript 对象的所有方法(私有、特权或公共)?这是示例对象:

当前的问题是 中的代码getMethods(),简化的示例将仅返回公共方法,而不返回私有方法。

编辑:我的测试代码可能(或可能不会)使我希望得到的东西过于复杂。给出以下内容:

myFunction()有没有办法从内部找出存在哪些变量myFunction()。伪代码如下所示:

0 投票
2 回答
7707 浏览

c++ - C++ 中的简单文本菜单

我正在用 C++ 编写一个愚蠢的小应用程序来测试我的一个库。我希望应用程序向用户显示命令列表,允许用户键入命令,然后执行与该命令关联的操作。听起来很简单。在 C# 中,我最终会编写一个命令列表/映射,如下所示:

关于如何在 C++ 中实现这一点的任何建议?我真的不想为每个命令定义单独的类/函数。我可以使用 Boost,但不能使用 TR1。

0 投票
4 回答
1950 浏览

javascript - Firefox Javascript 事件匿名函数

当用户单击 HTML 表中的单元格时,我试图注册一个匿名函数。下面是一些原始的、纯粹的代码:

注意使用eval, 因为它位于一个循环中,并且匿名函数每次都不同。

可以说,这在 Firefox 2 中工作得非常好。但是,Firefox 3 会抛出一个“语法错误”,指向“函数”一词之后的括号内。

有人对我如何解决这个问题有任何聪明的想法吗?


为了清楚地说明我正在尝试做什么,这里有一个非常简化的示例:

换句话说,我希望用不同的参数值来触发相同的函数div

0 投票
1 回答
13511 浏览

c# - 访问修改后的闭包 (2)

这是从Access 到 Modified Closure的问题的延伸。我只是想验证以下内容对于生产使用是否足够安全。

每次启动我只运行一次以上。现在它似乎工作正常。正如 Jon 在某些情况下提到的违反直觉的结果。那么我在这里需要注意什么?如果列表不止一次运行可以吗?

0 投票
4 回答
269 浏览

javascript - 如何在 JavaScript 匿名函数中声明时使用变量的值?

这是一个非常基本的问题,但是......

我有一些这样的代码

这应该绑定 divid="blah0"以在单击时将所有图像更改为'blah.jpg'。同样,单击 divid ="blah1"应将所有图像更改为'ha.jpg'.

但是,匿名函数不起作用,因为它将在执行时使用 'i' 的值,即 2。这意味着单击任一 div 将尝试将所有图像设置为 arr[2] - 不存在元素(有趣的是没有在我的机器上抛出 JS 错误,但那是另一个故事......)。

如何在声明时使用“i”的值创建匿名函数?

作为一个更简单的例子:

当我单击“blah0”时,这应该显示“0”,当我单击“blah1”时显示“1”等。

但是,默认情况下,无论我点击哪个“blah”,它都会显示“10”。

0 投票
3 回答
2154 浏览

design-patterns - 您是否在具有闭包/委托/函数指针的编程语言中使用模板方法模式?

在过去的 8 年里,我一直在 C# 和 Java 之间来回穿梭。

让我印象深刻的一件事是我已经完全停止在 C# 中使用“模板方法”设计模式。实际上,在 C# 中,我已经开始将这种模式视为一种反模式。

http://en.wikipedia.org/wiki/Template_method_pattern

回到 Java,我发现这种模式是活生生的。我仍然认为它看起来很古老,但意识到在 java 中没有其他方法可以做到这一点。Java 看起来也很古老;)

既然这无论如何都会出现,为什么它是反模式?

  • 很多时候,它会因为“错误的原因”耗尽你的继承层次结构。
  • 基类倾向于散布各种不相关的代码。
  • 它迫使您锁定设计,通常是在开发过程的早期阶段。(在很多情况下过早锁定)
  • 在以后的阶段改变这一点变得越来越难。

因此,对于闭包/委托/函数指针,您通常会传递一些函数而不是子类化。

那么回到问题:

如果您的语言有闭包/委托/函数,您是否使用模板方法,何时使用?

0 投票
7 回答
10893 浏览

python - 对嵌套函数运行单元测试

我来自 Java 世界,您可以在其中隐藏变量和函数,然后使用反射对它们运行单元测试。我使用嵌套函数来隐藏我的类的实现细节,这样只有公共 API 是可见的。我正在尝试针对这些嵌套函数编写单元测试,以确保在开发时不会破坏它们。我曾尝试调用其中一个嵌套函数,例如:

这导致错误消息:

AttributeError:'function'对象没有属性'inner'

我有没有办法针对这些嵌套函数编写单元测试?如果没有,有没有办法像类变量一样通过在它们前面加上__来触发函数名称的名称转换?

0 投票
8 回答
112606 浏览

javascript - var self = 这个?

使用实例方法作为事件处理程序的回调将范围this"My instance"更改为"Whatever just called the callback"。所以我的代码看起来像这样

它有效,但这是最好的方法吗?我觉得很奇怪。

0 投票
2 回答
13696 浏览

javascript - Javascript 循环中的事件处理程序 - 需要闭包吗?

我正在处理一些我从别人那里接手的 html 和 Javascript 代码。该页面每十秒重新加载一个数据表(通过异步请求),然后使用一些 DOM 代码重新构建该表。有问题的代码如下所示:

然而,当onchange为一个元素触发事件<select>时,似乎相同的值被传递给表中onStatusChanged()每个的方法<select>(我已经验证了在循环的每次迭代中,callid并被anotherid赋予了新的、不同的值)。

我怀疑这是因为我使用select.onchange = function()语法设置事件处理程序的性质。如果我理解它是如何正常工作的,那么这个语法将 onchange 事件的闭包设置为一个引用这两个引用的函数,它们最终具有在循环的最后一次迭代中设置的任何值的最终值。callid当事件触发时,和引用的anotherid值是在最后一次迭代中设置的值,而不是在单个迭代中设置的值。

有没有办法可以复制我传递给的参数的值onStatusChanged()

我更改了标题以更好地反映问题和接受的答案。