问题标签 [lexical-scope]

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 回答
1658 浏览

lambda - 在 Scheme 中使用“let over lambda”形式定义多个局部函数

我对在 Scheme 中定义多个可以相互调用的词法范围函数感到好奇。在 SICP 工作时,我使用块结构生成了以下函数来解决练习 1.8(使用牛顿法计算立方根):

这很好用,但它让我想知道 Scheme(也许还有 Common Lisp)如何使用词法作用域和let表单来处理相同的场景。我尝试使用let以下 kludgy 代码来实现它:

我在下面看到的问题是cbrt-iter尝试调用该good-enough?过程时。由于该good-enough?过程仅在第一个嵌套 let块的范围内是本地的,cbrt-iter因此无法访问它。似乎可以通过将cbrt-iter函数嵌套在 的let中来解决good-enough,但这似乎也很笨拙和尴尬。

define在这种情况下,有什么不同的形式?表单是否define扩展到lambda表达式而不是“让 lambda”表单(我记得在 Little Schemer 书中使用表单做了类似的事情((lambda (x) x x) (lambda (y) ...)),但我不确定这将如何工作)。此外,作为比较,Common Lisp 如何处理这种情况——是否可以使用词法范围defun的 's ?

0 投票
3 回答
355 浏览

javascript - Javascript - 闭包 - 词法范围 - 如何在嵌套函数中包含循环变量数据?

可能重复:
Javascript臭名昭著的循环问题?

我有以下代码:

一个库函数调用 footerTemplate 函数(该函数又调用 buildFooter)。buildFooter 中的警报指出该字段始终是相同的值(在 for 测试循环中迭代的最后一个值。)如何使用适当的字段值调用 buildFooter(即

等等...

0 投票
2 回答
699 浏览

function - emacs lisp 是否支持在词法上重新定义函数?

最新版本的 Emacs 支持 elisp 代码中变量的词法绑定。是否也可以在词法上重新定义函数?换句话说,Emacs Lisp 有类似的东西lexical-flet吗?

0 投票
1 回答
567 浏览

c++ - 如何在 C++ 中使用 lambda 作为词法作用域

代码是这样的:

我希望看到100结果。但是,在a中捕获时就像冻结一样f。结果是1。有没有办法在变化a时保持一致a

0 投票
1 回答
255 浏览

racket - Racket:for 内部的词法范围

在 Haskell 中,在列表推导中,我可以将表达式绑定到每次迭代的变量:

如何在 Racket 的for理解中绑定词法变量?

目前我有这个代码:

我想绑定(* i j)到一个变量并将表达式替换为函数中的任何地方。

0 投票
2 回答
954 浏览

ruby - Ruby Koans - 词汇范围与继承层次结构的延续

我有机会在 StackOverflow 中环顾四周,发现了同样的问题,我试图从 Ruby Koans 中更好地理解这个问题(Ruby Koans:类定义上的显式作用域第 2 部分)。

根据链接中的解释,其他人(包括我自己)的主要困惑似乎是因为类定义:

我最初的想法是 MyAnimals::Oyster 意味着 Oyster 类是在 MyAnimals 中定义的。换句话说,我认为上面的代码类似于下面的代码:

为了测试我的想法,我在 IRB 中做了以下操作:

如果我的推理是正确的,那么我希望下面的代码返回 2

由于这不返回 2,有人可以向我解释为什么它不返回 2?

编辑:我忽略了添加 Animal 类;这里是:

0 投票
4 回答
3208 浏览

ruby - Ruby - 词法作用域与继承

这是这个原始 SO 问题的延续:Using "::" instead of "module ..." for Ruby namespacing

在最初的 SO 问题中,这是我仍然无法理解的场景:

有人可以解释为什么第一个电话返回 555 以及为什么第二个电话返回 123 吗?

0 投票
2 回答
392 浏览

f# - F# 中的类型扩展和成员可见性

F# 具有称为“类型扩展”的功能,使开发人员能够扩展现有类型。有两种类型的扩展:固有扩展可选扩展。第一个类似于 C# 中的部分类型,第二个类似于方法扩展(但更强大)。

要使用内部扩展,我们应该将两个声明放入同一个文件中。在这种情况下,编译器会将两个定义合并为一种最终类型(即,这是一种类型的两个“部分”)。

问题是这两种类型对不同的成员和值有不同的访问规则:

我阅读了 F# 规范,但没有找到任何想法为什么 F# 编译器区分值和成员声明。

在 F# 规范的 8.6.1.3部分中说“实例定义定义的函数和值在词法范围内(因此隐式私有)到正在定义的对象。”。部分声明可以访问所有私有成员(静态和实例)。我的猜测是,“词法范围”规范作者专门指的是“主要”声明,但这种行为对我来说似乎很奇怪。

问题是:这种行为是故意的,其背后的理由是什么?

0 投票
2 回答
83 浏览

emacs - 为什么不在 let 形式的词汇上下文中评估此形式

我正在尝试创建一个宏来创建一个函数,该函数采用 S 表达式并在夹具的词汇上下文中评估它们。这是我写的宏:

但是当我运行它时,它似乎在我提供的词汇上下文之外执行

顺便说一句,我启用了变量词法绑定。关于我的错误有什么想法吗?

0 投票
1 回答
154 浏览

python - 这个 python 全局作用域魔法背后的逻辑是什么?

我在 python 中弄乱了范围,发现了一些我认为很奇怪的东西:

我认为第二次打印应该是“5”,因为全局语句从未执行过,但很明显,输出是 20(!)。

这背后的逻辑是什么?