闭包范围未捕获? — 咖啡脚本

2023-11-26

好吧,我不知道如何表达这个问题的标题。

openDir = (path) ->
socket.emit "get_metadata", path, (data) ->
    columnBox = $ "<div/>", class: "columnbox"
    for item in data.contents
        itemBox = $ "<div/>", class: "itembox"
        itemBox.click ->
            columnBox_inner.children().removeClass "selected"
            itemBox.addClass "selected" # <<<--- Over here
            openDir item.path
        columnBox.append itemBox
    columnBox.appendTo "#columnscontainer"

我理解变量itemBox定义如下openDir的范围在这里。但由于指出的行位于 lambda 函数中,因此不应itemBox那里捕获引用的对象itemBox父作用域的而不是突变到它引用的最后一个对象?

明确地说,我期望每个的点击处理程序itemBox去表演addClass "selected"对自己。但发生的事情是itemBox在每个单击处理程序中始终引用最后一个 itemBox。

我可以通过更改 itemBox 的声明位置轻松解决此问题。即改变

for item in data.contents

into

data.contents.forEach (item) ->

但我想知道为什么 lambda 函数不捕获变量的当前值。


这个循环:

for item in data.contents
    itemBox = $ "<div/>", class: "itembox"

如果您不习惯 (Coffee|Java)Script 范围,则有些欺骗性。范围实际上看起来更像是这样的:

itemBox = undefined
for item in data.contents
    itemBox = $ "<div/>", class: "itembox"

所以只有一个itemBox变量,并且循环的每次迭代都会使用同一变量。单击处理程序保留对itemBox但在调用单击处理程序之前不会评估变量,因此所有处理程序最终都会得到相同的结果itemBox值,这将是itemBox循环结束时的值。

来自精美手册:

当使用 JavaScript 循环生成函数时,通常会插入闭包包装器以确保循环变量被封闭,并且所有生成的函数不仅仅共享最终值。 CoffeeScript 提供了do关键字,它立即调用传递的函数,转发任何参数。

所以你可以这样做:

for item in data.contents
    do (item) ->
        # As before...

得到你的itemBox范围分别为循环的每次迭代。

Using forEach:

data.contents.forEach (item) ->

而不是简单的循环可以工作,因为您有效地使用函数作为循环体,并且该函数内的任何变量都将作用于该函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

闭包范围未捕获? — 咖啡脚本 的相关文章

  • 如何在 gcc 内联汇编中声明和初始化局部变量而不使用扩展内联 asm?

    我知道这是一个非常基本的问题 但我真的很困惑 事实上我绝对是 GCC 语法的新手 我想要拥有局部变量 带有标签的堆栈地址 而不使用扩展内联汇编 类似 Intel 语法中的以下代码 DATA1 DB 100 MOV AL DATA1 我猜这是
  • C++ 使用对正在定义的变量的引用

    根据标准 不考虑 以下代码是否有效 C bool f T r if r return true return false T x f x x T 众所周知 要在该项目使用的 GCC 版本中进行编译 4 1 2 和 3 2 3 甚至不让我开始
  • jinja 模板变量赋值范围

    鉴于以下 Jinja 片段 set sep for stamp in stamp list for heartbeat in heartbeat list if heartbeat name site name and heartbeat
  • C中的副作用是什么?

    维基百科说 在计算机科学中 一个操作 函数或表达式被认为具有副作用如果它在其本地环境之外修改某些状态变量值 也就是说 除了向操作的调用者返回一个值 主要效果 之外 还具有可观察到的效果 但是我们如何访问本地环境之外的变量 任何人都可以解释这
  • JavaScript作用域问题

    我正在调用此函数 将结果分配给回调中的变量 然后记录结果 但我一直未定义 var id test getID function result id result console log id 如果我将其更改为下面的代码 那么我可以看到记录的
  • 使用 CoffeeScript 以编程方式检查复选框

    如何以编程方式检查 Coffeescript 中的复选框 我知道在 Javascript 中 我可以使用这个 myElement checked true 我可以在 Coffeescript 中执行类似以下操作吗 myElement che
  • angularjs foreach循环通过依赖于先前请求的http请求

    我想循环遍历一个数组以角度执行 http jsonp 请求 但是每个请求都会略有不同 具体取决于前一个 http jsonp 请求的时间戳 我试图循环 5 个请求 每个请求都依赖于前一个请求信息 如何执行 foreach 循环来等待每个 h
  • 如何阻止远程表单提交?

    我有一个可以远程和正常使用的表格 form for comment html class comment form remote request xhr do f f text area body f submit 我希望仅在以下情况下提交
  • 使用 jQuery 加载脚本时保持范围

    假设我有一个包含以下内容的文件 test js var test something 然后我有一个主要脚本需要加载 test js 以获取测试变量 显然这有效 ajax dataType script cache true url test
  • 关于 PHP 范围的问题 - 从 Java 程序员的角度来看

    我对 PHP 还很陌生 所以我试图理解 PHP Web 应用程序中的范围概念 在 Java 世界中 Java Web 应用程序 使用 Java Server Pages JSP 及以上 将允许 Java Bean 具有以下级别的范围 Pag
  • 多个指令 [myPopup、myDraggable] 请求新的/隔离的范围

    我编写了一个对话框指令 myPopup 和另一个用于拖动此对话框的指令 myDraggable 但我总是收到错误 多个指令 myPopup myDraggable 请求新的 隔离的范围 这是一个笨蛋 http plnkr co edit k
  • 不能需要本地 CoffeeScript 模块

    我正在运行 Node js 0 10 21 我尝试了 CoffeeScript 1 6 3 并掌握了有和没有的情况require coffee script extensions 当然 将这两个文件编译为 JavaScript 并直接在 N
  • 链接“let”语句时使用“and”还是“in”更好?

    我意识到这可能是一个愚蠢的问题 但是 如果我把一堆let不需要需要了解彼此价值观的语句 使用是否更好and or in 例如 以下哪一个更可取 如果有 let a foo and b bar and c baz in etc or let
  • 使用 Sinon.js 并阻止调用我的应用程序服务器

    足够简单的问题 我希望我们 sinon js 测试一段 javascript 以确保它调用 ajax方法同时做两件事 我不想真正访问服务器 我想模拟来自服务器的响应 所以这是 JS ajax url tickets id json data
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • 有没有办法将 CoffeeScript 发送到客户端的浏览器并*在那里*将其编译为 JavaScript?

    有没有办法将 CoffeeScript 发送到客户端浏览器并将其编译为 JavaScriptthere CoffeeScript编译器是用JavaScript编写的 那么我可以将其发送给客户端以在客户端浏览器中编译 运行此代码吗 杰里米已经
  • 全局变量声明

    我是 Python 的初学者 并且已经处理过全局变量的概念 当我以为我理解了这个概念时 我看到了一段简短的代码 证明我错了 message global def enclosure message enclosure def local g
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti
  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • 从 array_map 匿名函数内部调用类方法

    我正在尝试从一个对象中调用我的对象的方法之一array map匿名函数 到目前为止 我收到了预期的错误 致命错误 不在对象上下文中时使用 this 我知道为什么我会收到此错误 我只是不知道如何实现我想要的目标 有人有任何建议吗 这是我当前的

随机推荐

  • 扩展打字稿接口

    在 TypeScript 中扩展 Express Request 接口时 我遇到了这个问题 我想使用外部库定义 但无法导入外部库 因为它会导致错误 gt 错误 4 28 TS1147 内部模块中的导入声明无法引用外部模块 编辑 这是一个 d
  • ReferenceError:未定义要求

    我目前正在开发 Mozilla Firefox 插件 我已经设置了一个面板并附加了一个内容脚本 我需要在内容脚本和 main js 之间进行通信 我为此使用 addon sdk 的端口 api 然而由于某种原因 我什至无法在两者之间传递简单
  • 向量储备 C++

    我有一个非常大的多维向量 其大小一直在变化 当我只知道大小的近似值时 使用 vector reserve 函数有什么意义吗 所以基本上我有一个向量 A 256 256 x y 其中 程序中的每次迭代 x 都会从 0 变化到 50 然后再次变
  • Spark 数据帧的 null 值和 countDistinct

    我有一个非常简单的数据框 df spark createDataFrame None 1 3 2 1 3 2 1 3 a b c a b c null 1 3 2 1 3 2 1 3 当我申请一个countDistinct在此数据框上 我发
  • UISearchDisplayController 自动释放如何导致不同视图控制器崩溃?

    我有两个视图控制器 A 和 B 从 A 我导航到视图控制器 B 如下所示 in View Controller A navigateToB method void navigateToB BViewController bViewContr
  • 我可以避免 .NET 中的 JIT 吗?

    假设我的代码是否始终在特定处理器上运行 并且如果我在安装过程中拥有此信息 我是否有机会避免 JIT Use NGEN 本机映像生成器 Ngen exe 是一种可提高托管应用程序性能的工具 Ngen exe 创建本机映像 这些映像是包含已编译
  • 如何让 Internet Explorer 8 支持第 n 个 child() CSS 元素?

    我想为我的表格行提供斑马条纹效果 在所有其他浏览器中 可以使用 CSS 第 n 个子元素来完成 但我也想在 IE 8 上这样做 那么我该怎么做呢 使用填充 选择性就足够好了 没有polyfill 由于IE8支持第一个孩子 你可以欺骗它来支持
  • Cookie 中允许使用哪些字符?

    Cookie 名称和值中允许使用哪些字符 它们与 URL 或某些公共子集相同吗 我问的原因是我最近遇到了一些奇怪的 cookie 行为 这些行为 以他们的名字命名 我只是想知道这是否是特定于浏览器的 或者我的代码是否有问题 根据古老的网景c
  • find 缺少选项 -printf,现在怎么办?

    我还没有找到Mac的find没有 printf选项的原因 苹果通常会决定去掉与其他命令不正交的选项 如何在 Mac 中达到与以下命令相同的结果没有 coreutils find printf i n command in Ubuntu 这并
  • 如何在eclipse中导入com.sun.javadoc.*?

    导入 com sun javadoc eclipse 向我报告此错误 导入 com sun javadoc 无法解析 似乎未安装该包 查看网站http download oracle com javase 1 5 0 docs guide
  • 如果构造函数的参数非法,则阻止类的实例化?

    我有一个公共构造函数 它接受一个参数 int Age 来创建一个对象 我想检查传递的参数是否合法 例如年龄不能为负数 如果非法 则不要创建对象 实例 如果合法的话没问题 我只能想到一种方法来做到这一点 将构造函数设为私有 创建一个带有参数
  • 什么是未定义的引用/未解析的外部符号错误以及如何修复它?

    什么是未定义的引用 未解析的外部符号错误 常见原因有哪些 如何修复和预防这些错误 假设您有以下代码 a cpp int get return 0 b cpp int get usually one doesn t write this di
  • JQuery 检测标签是否自关闭

    有没有办法像图像标签一样使用 JQuery 检测标签是否自动关闭 动态的东西不仅仅是图像标签 if selector 0 tagName toLowerCase img do something jQuery 在内部使用这个列表 area
  • Flutter - 未处理的异常:FormatException:意外的字符(在字符 1 处)|响应实例

    当我获取 api 时 控制台显示如下错误 E flutter 10838 错误 flutter lib ui ui dart state cc 157 未处理的异常 FormatException 意外的字符 在字符 1 处 E flutt
  • Git 错误:[远程拒绝] master -> master(缺少必要的对象)

    我对 git 有一个相当令人担忧的问题 几天前 当服务器 git 出现蓝屏时 我正在提交一些更改 我们认为这实际上是由 git 引起的 从那时起 我无法向存储库提交任何更改 而其他人可以 我无法再对服务器崩溃时提交的文件提交更改 但是我可以
  • 如何不硬编码密码?

    在我的最后一个问题 用于存储秘密的便携式数据库 中迄今为止最好的答案告诉使用 sqlite crypt 阅读 sqlite crypt 文档 打开数据库的新参数是密码 当然 我不想对密码进行硬编码 所以我在想存储密码的最佳 简单且快速的方法
  • 让 CMake 声明一个虚假目标

    我想生成一些compile时间常数 这第一个答案另一个问题让我非常接近 来自我的 CMakeLists txt add library PROJECT NAME STATIC CXX SRCS compile time hpp add cu
  • 在 java/swing 中关闭窗口时采取的正确操作是什么?

    我刚刚在我的 CustomUIPanel 类中编写了这个测试代码 public static void main String args final JDialog dialog CustomUIPanel createDialog nul
  • 查找源代码从 git 分支的位置

    我有一个 git 存储库 或多或少涵盖了项目历史 和单独的源代码 只是一个只有几个文件的 tarball 它们在不久前 实际上是在 2004 年或 2005 年的某个地方 分叉了 tarball 的源代码已经发生了相当多的变化 我想从中合并
  • 闭包范围未捕获? — 咖啡脚本

    好吧 我不知道如何表达这个问题的标题 openDir path gt socket emit get metadata path data gt columnBox div div class columnbox for item in d