问题标签 [scoping]

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 投票
3 回答
219 浏览

c++ - C ++中变量范围的嵌套不正确?

我有一些看起来像这样的代码:

为了论证起见,假设默认构造函数的ComplexObject成本很高。

  • C++ 编译器可以(并且可以)用复制构造函数替换 cpy 的默认构造/赋值吗?
  • 有没有办法重组代码以强制优化,同时保留两个本地对象的范围?

编辑:我真的在寻找一个通用的解决方案来解决想要将 RAII 对象与其他东西不正确嵌套的问题。

Konrad Rudolph的解决方案有何评论?


编辑2:

原始代码具有以下顺序:

  1. 默认构造cpy
  2. 构建 RAIIlock
  3. 分配(复制)现有对象cpy
  4. 破坏lock
  5. 利用cpy
  6. 破坏cpy

我想要的是:

  1. 构建 RAIIlock
  2. 构造cpy(在这种情况下,通过使用现有对象的复制构造函数)。
  3. 破坏lock
  4. 利用cpy
  5. 破坏cpy
0 投票
7 回答
71706 浏览

javascript - 浏览器内 JavaScript 需要节点样式?

是否有任何浏览器内 javascript 库提供与 Node 相同的灵活性/模块化/易用性require

提供更多细节:之所以require这么好,是因为它:

  1. 允许从其他位置动态加载代码(在我看来,这在风格上比在 HTML 中链接所有代码更好)
  2. 它为构建模块提供了一致的接口
  3. 模块很容易依赖于其他模块(例如,我可以编写一个需要 jQuery 的 API,这样我就可以使用jQuery.ajax()
  4. 加载的 javascript 是作用域的,这意味着我可以加载var dsp = require("dsp.js");并且可以访问dsp.FFT,这不会干扰我的本地var FFT

我还没有找到一个有效地做到这一点的图书馆。我倾向于使用的解决方法是:

  • coffeescript-concat - 需要其他 js 很容易,但你必须编译它,这意味着它不适合快速开发(例如构建测试中的 API)

  • RequireJS——它很流行,简单明了,解决了 1-3,但缺乏范围界定是一个真正的交易破坏者(我相信head.js是相似的,因为它缺乏范围界定,虽然我从来没有任何机会使用它。同样,LABjs可以加载并缓解.wait()依赖问题,但它仍然不做范围界定)

据我所知,似乎有许多动态和/或异步加载 javascript 的解决方案,但它们往往具有与仅从 HTML 加载 js 相同的范围问题。最重要的是,我想要一种加载 javascript 的方法,它根本不会污染全局命名空间,但仍然允许我加载和使用库(就像 node 的 require 一样)。

2020 年更新: 模块现在是 ES6 中的标准,并且截至 2020 年中期,大多数浏览器都原生支持。模块支持同步和异步(使用 Promise)加载。我目前的建议是大多数新项目应该使用 ES6 模块,并使用转译器为旧版浏览器回退到单个 JS 文件。

作为一般原则,今天的带宽通常也比我最初提出这个问题时要宽得多。因此,在实践中,您可能会合理地选择始终使用带有 ES6 模块的转译器,并将精力集中在代码效率而不是网络上。

以前的编辑(或者如果你不喜欢 ES6 模块):自从写这篇文章以来,我广泛使用了RequireJS(现在有更清晰的文档)。在我看来,RequireJS 确实是正确的选择。我想澄清一下这个系统是如何为像我一样困惑的人工作的:

您可以require在日常开发中使用。模块可以是函数返回的任何东西(通常是对象或函数),并且作用域为参数。您还可以将项目编译为单个文件以进行部署r.js(实际上这几乎总是更快,即使require可以并行加载脚本)。

RequireJS 和 node-style require (如 browserify (tjameson 推荐的一个很酷的项目))使用的主要区别在于模块的设计和需求方式:

  • RequireJS 使用 AMD(异步模块定义)。在 AMD 中,require获取要加载的模块列表(javascript 文件)和回调函数。当它加载了每个模块时,它会调用回调,并将每个模块作为回调的参数。因此它是真正异步的,因此非常适合网络。
  • Node 使用 CommonJS。在 CommonJS 中,require是一个加载模块并将其作为对象返回的阻塞调用。这对 Node 来说很好,因为文件是从文件系统中读取的,这足够快,但在 Web 上效果不佳,因为同步加载文件可能需要更长的时间。

在实践中,许多开发人员在看到 AMD 之前就已经使用过 Node(以及 CommonJS)。此外,许多库/模块是为 CommonJS(通过向exports对象添加内容)而不是为 AMD(通过从define函数返回模块)编写的。因此,许多从 Node 转向 Web 的开发人员都希望在 Web 上使用 CommonJS 库。这是可能的,因为从<script>标签加载是阻塞的。browserify 之类的解决方案采用 CommonJS (Node) 模块并将它们包装起来,以便您可以将它们包含在脚本标签中。

因此,如果你正在为 Web 开发自己的多文件项目,我强烈推荐 RequireJS,因为它确实是一个用于 Web 的模块系统(尽管公平地披露,我发现 AMD 比 CommonJS 更自然)。最近,这种区别变得不那么重要了,因为 RequireJS 现在允许您基本上使用 CommonJS 语法。此外,RequireJS 可用于在 Node 中加载 AMD 模块(尽管我更喜欢node-amd-loader)。

0 投票
18 回答
15229 浏览

javascript - Javascript函数作用域和提升

我刚刚阅读了Ben Cherry 撰写的一篇关于 JavaScript 作用域和提升的精彩文章,他在其中给出了以下示例:

使用上面的代码,浏览器会提示“1”。

我仍然不确定为什么它返回“1”。他说的一些事情让我想起了:所有的函数声明都被提升到了顶部。您可以使用函数作用域变量。仍然没有为我点击。

0 投票
4 回答
92 浏览

c# - c# 范围问题,我确定简单修复

所以我有以下代码,它几乎可以完美地工作,除了无论我做什么我都无法获得类似的部分:for (int.parse(txtGuess.Text) == numbGen)无论我将它放在代码中的哪个位置,它都无法识别“numbGen”。我不能将它放在按钮单击功能中,因为我不希望更改数字,除非他们已正确或重新打开表单。

}

0 投票
1 回答
4246 浏览

dynamic - Common Lisp 作用域(动态与词法)

编辑:我在第一个答案后更改了示例代码,因为我想出了一个简单的版本,它提出了同样的问题。

我目前正在学习 Common Lisp 的作用域属性。在我认为我有一个扎实的理解之后,我决定编写一些可以预测结果的示例,但显然我错了。我有三个问题,每个问题都与以下示例有关:

示例 1:

输出:

问:这是有道理的。x 是静态作用域的,如果不显式传递,fun2 无法找到 x 的值。

示例 2:

输出:

问题:我不明白为什么 x 突然以 fun1 给它的值对 fun2 可见,而不是值为 100...

示例 3:

输出:

问题:我是否应该忽略这些结果,因为在未声明的变量上调用 setf 显然是未定义的?这恰好是我在第二个示例中所期望的......

任何见解将不胜感激......

0 投票
2 回答
248 浏览

scala - 方法中的 Scala 不明确变量名称

我看过一些关于 Scala 和变量作用域的问题(例如Scala variable scoping question

但是,我无法让我的特定用例正常工作。

假设我有一个名为 Repo 的特征:

然后我有一种方法来创建 Repo 的实现......

当然,我使用了两个source变量,一个在方法级别,一个在Repo实现内部。如何source从我的Repo定义中引用方法级别?

谢谢!

0 投票
3 回答
302 浏览

scala - Scala 中的范围和内存问题

我有一个非常大的数字列表,经过大量的数学运算。我只关心最后的结果。要模拟这种行为,请参见下面的示例代码:

所以 x 是一个非常大的列表。我只关心结果 z。要获得 z,我首先必须对 x 进行数学运算以得到 y。然后我操纵 y 得到 z。(我不能一步从 x 到 z,因为操作非常复杂。这只是一个例子。)

所以当我运行这个例子时,大概是因为x、y和z都在作用域内,而且它们都占用了内存,所以我的内存用完了。

所以我尝试以下方法:

所以现在只有 z 在范围内。所以大概 x 和 y 被创建,然后当它们超出范围时被垃圾收集。但这不是发生的事情。相反,我再次耗尽内存!

(注意:我正在使用 java -Xincgc,但它没有帮助)

问题:当我只有 1 个大列表有足够的内存时,我是否可以仅使用 val (即没有可变变量或 ListBuffers )以某种方式对其进行操作,也许使用范围来强制 gc ?如果是这样,如何?谢谢

0 投票
1 回答
301 浏览

activerecord - Active Record 关系连接 - 3 个主表,2 个连接表

设置

我有一个包含 3 个主要表(用户、链接、主题)和 2 个连接表(link_saves 和 link_topics)的数据模型。我的模型:

用户

链接保存

关联

链接主题

话题

问题

我希望能够找到用户为其保存链接的所有主题的列表。我希望能够做到@user.topics并让它跨越从用户到主题的所有 5 个表。更重要的是,我希望它返回一个 ActiveRecord 关系,以便我可以进一步范围/排序/分页用户主题列表,因此这不起作用:

我走错路了吗?有没有办法通过活动记录来做到这一点,而不必编写所有自定义 SQL?请帮忙!

可能的答案(更新)

使用多个has_many :throughs 来制作所有的跃点。这行得通,但不能成为最佳实践,对吧?

0 投票
3 回答
420 浏览

python - Python范围可变与不可变

首先,我要像其他人一样开始。我是 python 新手。我的老师给了我一个问题:

它打印:

我知道 a 保持在 10 因为整数是不可变的,但我不明白为什么 b 会改变而 c 不会。

0 投票
2 回答
2421 浏览

scoping - 静态和动态范围界定之间的相似之处

静态和动态范围界定之间有什么相似之处吗?我几乎找不到任何东西。