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

scope - 动态范围的优点是什么?

我了解到静态作用域是唯一明智的做事方式,而动态作用域是魔鬼的工具,仅由解释器/编译器的不良实现造成。

然后我从Common Lisp vs. Scheme文章中看到了这个片段:

为什么 Common Lisp “在这一点上获胜”?使用动态作用域更容易做哪些事情?我真的无法证明需要它/将其视为一件好事。

0 投票
2 回答
1153 浏览

language-agnostic - 为什么我有时会听到“词法变量”这个词?

我已经多次看到术语“词法变量”,主要是在闭包的上下文中。Paul Graham 在他关于 Lisp 的书中使用这个术语来指代使用 let 表达式定义的变量。

我知道词法作用域是静态作用域的另一个名称。词法变量只是在程序单元的引用环境中可见的变量吗?

我希望在这个假期用这个词给我的朋友和家人留下深刻的印象,有人可以帮帮我吗?

0 投票
5 回答
13490 浏览

lisp - Common Lisp 中的动态和词法变量

我正在阅读 Peter Seibel 的《实用通用 Lisp》一书。

在第 6 章,“变量”部分,“词法变量和闭包”和“动态,又名特殊,变量”。 http://www.gigamonkeys.com/book/variables.html

我的问题是,这两个部分中的示例都显示了 (let ...) 如何影响全局变量,并且并没有真正说明动态变量和词法变量之间的区别。

我了解闭包是如何工作的,但在这个例子中我真的不明白 let 有什么特别之处:

我觉得这里没有什么特别的。bar中的外部foo递增全局x,而被let in bar包围的foo递增阴影x。有什么大不了的?我不明白这应该如何解释词法变量和动态变量之间的区别。然而这本书仍然是这样的:

那么这是如何工作的呢?LET 怎么知道当它绑定x时它应该创建一个动态绑定而不是正常的词法绑定?它知道是因为名称已被声明为特殊的。12 使用 DEFVAR 和 DEFPARAMETER 定义的每个变量的名称都会自动声明为全局特殊的。

如果let使用“普通词法绑定”绑定x会发生什么?总而言之,动态绑定和词法绑定有什么区别?这个例子对于动态绑定有什么特别之处?

0 投票
6 回答
3043 浏览

python - Python 中的闭包

我一直在尝试学习 Python,虽然我热衷于在 Python 中使用闭包,但我一直无法让一些代码正常工作:

基本上,这应该做的是使用闭包来维护函数的记忆状态。我意识到可能有很多更快、更容易阅读并且通常更“Pythonic”的方法来实现它;但是,我的目标是准确了解闭包在 Python 中的工作原理,以及它们与 Lisp 的不同之处,因此我对替代解决方案不感兴趣,只是为什么我的代码不起作用以及我能做些什么(如果有的话)来修复它。

我遇到的问题是当我尝试使用fibm- Python 坚持get没有定义:

鉴于我是 Python 新手,我不知道我是否做错了什么,或者这只是语言的限制。我希望是前者。:-)

0 投票
2 回答
650 浏览

javascript - 为什么jQuery在一开始就有一个“window=this”并说它会加速对window的引用?

当我打开 jQuery 的源代码时,我找到了这一行。

这条线路为何以及如何加速?

0 投票
5 回答
514 浏览

compiler-construction - 为什么编译器更喜欢词法作用域?

词法作用域如何帮助编译器?它对编译或优化有帮助吗?

0 投票
20 回答
250578 浏览

javascript - 什么是词法作用域?

什么是词法作用域的简要介绍?

0 投票
3 回答
1452 浏览

lisp - Lisp 警告:xx 既未声明也未绑定,将被视为已声明为 SPECIAL

我是 lisp 的新手,正在编写一些简单的程序来熟悉它。我正在做的一件事是编写阶乘方法的递归和迭代版本。但是,我遇到了一个问题,似乎无法解决。

我在 Lisp 看到了一个类似的错误 : CHAR 既没有声明也没有绑定 ,但实际上没有找到解决方案,除了 OP 意识到他犯了一个“打字错误”。在 REPL 中,我可以使用 setf 函数,它工作正常。我也在使用带有 emacs 的 LispBox。我将不胜感激任何建议!

IT-FACT 中的警告:RESULT 既没有声明也没有约束,它将被视为已声明为 SPECIAL。

0 投票
1 回答
634 浏览

c# - C# lambda/匿名委托中的词法范围

我想检查一个简单的数学表达式是否会溢出(使用checkedand catch(OverflowException)),但不需要每次都使用 try-catch 块。所以表达式(不是结果!)应该传递给一个函数checkOverflow,然后在溢出的情况下相应地采取行动。

这是我尝试过的,但不起作用,因为 lambda 表达式似乎没有词法范围。

有什么解决办法吗?(使用 .NET 2,但不一定。)

0 投票
5 回答
3308 浏览

programming-languages - 词法作用域是如何实现的?

几年前,我开始为包含程序员定义的函数的小型领域特定语言编写解释器。

起初,我使用一个简单的符号表堆栈来实现变量范围。但现在我想转向正确的词法范围(可以选择闭包)。谁能解释词法作用域背后的数据结构和算法?