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

javascript - javascript函数中的词法范围

以下片段:

返回未定义。

据我了解,函数在定义时可以访问变量,并在执行时访问这些变量的值。所以,在这种情况下,我猜 f2 可以访问全局变量“a”,并读取它的修改值 (1)。那么为什么它是未定义的呢?

0 投票
4 回答
2071 浏览

lisp - Emacs lisp:为什么这个 sexp 会导致无效函数错误?

有问题的性别是

对我来说,它看起来应该评估为8,并且在其他lisp(例如Racket)中它确实如此,但是在elisp中它会抛出这个错误:

它似乎在告诉我

不是一个有效的函数。这似乎是错误的,因为当我评估该表达式时,我得到

这对我来说看起来像是一个有效的功能。有谁知道为什么会这样?它与动态范围有关吗?

0 投票
1 回答
469 浏览

lisp - Common Lisp 中的“假”全局词法变量

Google Common Lisp 样式指南的“全局变量和常量”部分中指出:

“Common Lisp 没有全局词法变量,因此使用命名约定来确保动态绑定的全局变量的名称永远不会与局部变量重叠。

可以使用不同名称的全局变量和DEFINE-SYMBOL-MACRO来伪造全局词法变量。你不应该使用这个技巧,除非你首先发布一个将它抽象出来的库。”

请有人帮我理解最后一句话的意思。

0 投票
1 回答
99 浏览

ruby - Ruby解析器的原理是什么?

我如何预测 Ruby 将如何解析事物?

在尝试连接字符串时,我在 Ruby 中遇到了一个非常令人惊讶的解析错误。

当然,如果你把额外的空间放在它们里面,它就会按预期工作;

如果我有anything.any_method +"any string". Ruby 所做的是假设我们已经省略了括号,并试图为该方法提供一个参数;

它注意到我们没有+@在字符串上定义一元运算符,并抛出该错误。

我的问题是,我应该使用什么原则来预测 Ruby 解析器的行为?经过大量的谷歌搜索后,我才发现了这个错误。值得注意的是,.capitalize它从来不带参数(甚至在 C 源代码中也不带参数)。如果您使用不适用于前一个对象的方法,它仍然会抛出+@错误而不是undefined method 'capitalize' for "every":String错误。所以这个解析显然是高级别的。我没有足够的知识阅读 Matz 的parser.y。我遇到了其他类似的令人惊讶的错误。谁能告诉我Ruby的解析优先级?

0 投票
2 回答
941 浏览

r - 关于 R 中的词法作用域

我对 R 相当陌生,在阅读手册时,我偶然发现了一段关于词法作用域的文章以及以下代码示例:

所以,我理解上面的代码做了什么,我想我仍然对它的工作原理感到困惑。如果在函数执行完成后您仍然可以访问函数的“局部”变量,那么预测何时不再需要变量不是很难或不可能吗?在上面的代码中,如果它被用作更大程序的一部分,“total”是否会保存在内存中,直到整个程序完成?(本质上成为一个全局变量内存)如果这是真的,不会这会导致内存使用问题吗?

我在这个网站上查看了另外两个问题:“词汇范围是如何实现的?” 和“为什么编译器更喜欢词法范围?”。那里的答案在我脑海中浮现,但它让我想知道:如果(正如我猜测的那样)编译器不只是使所有变量成为全局变量(内存方面),而是使用某种技术来预测某些变量何时不会不再需要并且可以删除,做这项工作实际上不会使编译器更难而不是更容易吗?

我知道这是很多不同的问题,但任何帮助都会很好,谢谢。

0 投票
2 回答
226 浏览

emacs - strange interaction between lexical-binding and defvar in emacs lisp

The following emacs lisp file is about seeing what happens when Alice uses a lexically bound local variable foo in her init file and Bob defines foo as a global special variable with defvar in his init file and Alice borrows part of Bob's init file code into her own init file not knowing that foo is going to turn special.

Output:

Results R1 and R2 are just as what I expect. Result R4 is consistent with defvar documentation, although it may surprise Alice unless she reads Bob's code.

  1. I find R3 surprising. Why is R3 like that?

  2. Speaking of R4, what can Alice do to protect her foo from turning special by others? For example, foo may be a lexical local variable she uses in her init file or one of her emacs package, and (defvar foo "something") may be in some of the packages she happens to use, or foo could be one of the new special variable names introduced by a future version of Emacs. Is there something Alice can put in her file that says to Emacs "In this file, foo should be always lexical, even if some code from outside happens to use a special variable of the same name"?

0 投票
1 回答
177 浏览

javascript - Javascript范围链式提升

例如,我有点困惑如何在 JavaScript 中完成词法作用域

如果我们a在第 5 行重新定义,那么它将打印undefined. 这是为什么?为什么解释器不向上遍历检查outer.VO,即使a可以在 中找到inner.VO,但它在定义之前就被使用了?

0 投票
3 回答
1398 浏览

javascript - javascript中的词法范围参数

通过 Javascript Koans 工作,我开始关注以下代码:

它得到23,这很好。我感到困惑的是,赋予“mysteryFunction3”变量的参数如何/为什么作为“参数”传递给 doMysteriousThing 函数。

如果有一个内部函数和一个外部函数,每个函数都采用一个参数,那么在给定指定参数的情况下定义一个等于外部函数的变量,这只是生活中的事实,例如:

将使其向外部函数的变量实例发送参数,例如:

会导致该参数(10)被读取为内部函数的参数吗?

0 投票
3 回答
402 浏览

lisp - 关于 Common Lisp 作用域的微妙之处(动态与词法)

在阅读了关于声明SPECIAL、特殊运算符LET、宏DEFVAR的文档以及 StackOverflow 上关于 Common Lisp 中动态与词法范围的几个问题之后,例如this,我仍然无法理解之后的以下行为在 SBCL 中评估这些表格。

为什么第三次调用fn,在变量x被defvar'ed之前打印DINAMIC_1ST_BINDING并且在变量x被defvar'ed之后打印LEXICAL_1ST_BINDING

0 投票
0 回答
130 浏览

javascript - 变量对象的 JavaScript 静态作用域和运行时评估

据说JavaScript结合了两件事;

  1. 变量对象的动态、运行时评估
  2. 静态/词法定义范围

有人可以用一些“棘手”的例子来解释上述内容,这些例子可以非常清楚地展示和帮助理解上述几点。

我假设静态范围意味着范围基于函数在代码中物理定义的位置。