问题标签 [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 回答
173 浏览

lisp - 一般来说,“词汇和特殊变量”语义是如何在幕后实现的?

CLtL2 阐明了范围和范围之间的区别。对于词法变量和特殊变量,我的看法是,词法变量是“无限范围的词法范围”,而特殊变量是“无限范围的动态扩展”。</p>

我的问题是:“词法和特殊变量”语义一般是如何在幕后实现的?我所说的“一般”是指一个一般的想法就足够了。鉴于 Lisp 的悠久历史,必须有许多优化已应用于实现这些基本概念。

为了启动讨论,我在下面大胆猜测。

一切都从环境开始。环境是一系列帧,每个帧都是一个将名称映射到位置的表(可以检索和存储其值);每个这样的映射都是一个名字到一个地方的绑定。框架通过封闭关系链接;内部框架中的名称可以覆盖外部框架中的相同名称。此外,Common Lisp 中的绑定默认是词法的,除非declare-d/ declaim-ed/ proclaim-ed 是特殊的。

语义有两个方面:名称查找和新绑定的创建。

  • 创建一个新的绑定。lambda表达式、let/ let*labels/ fletmacrolet和使用它们的宏创建绑定。词法绑定是通过创建一个新框架并使当前词法环境成为新创建的框架的封闭环境来创建的。一个特殊的绑定(必须显式声明)将一个新位置推到为当前包中的名称创建的堆栈顶部(堆栈可以通过名称上的哈希表定位)——堆栈用于实现动态范围,以便在构造表单退出时,可以通过弹出堆栈来解构绑定(问题是如何确保如此,也许unwind-protect在引擎盖下有类似的东西?)。

  • 名称查找。除非明确声明为特殊,否则名称查找默认为在词法环境中查找——通过在绑定创建期间建立的框架链接。查找过程中第一个匹配的名称获胜。对于特殊名称(必须明确声明),查找是通过查看堆栈顶部来提供的。

0 投票
2 回答
2294 浏览

scope - 词法作用域与动态作用域

所以我有这个问题,我必须使用两个不同的范围规则来计算输出。我知道使用词法作用域的输出是a=3and b=1,但是我很难用动态作用域来计算输出。
注意:下面的代码示例使用 C 语法,但我们将其视为伪代码。

这是我想出的。a使用动态范围,对和的非本地引用b可以更改。所以我有a=2(从 p() 返回),然后是b=4(在 q() 内)。所以输出是2 4

0 投票
1 回答
227 浏览

r - R中的词法范围

我最近了解到 R 有可用的词法和动态范围,但它默认使用词法范围。下一个案例真的让我很困惑:

不应该使用定义f它的环境(以及当时!)而不是调用它的环境来评估?这个词法范围如何?谢谢!

0 投票
0 回答
166 浏览

python - Python:使用 *constant* 闭包强制执行本地范围

假设我想重用一些代码,将其命名为“函数 C”,其用法仅属于“函数 R”的范围。将函数定义嵌套在 R 中,用于将其名称限制在本地范围内(最简单的闭包,如果可以这样调用的话)。函数 C 不应该被返回,有任何副作用,甚至引用它的外部作用域(除了全局和导入的模块)

对于大量 R() 调用,这是否会导致任何性能损失:

即使我在全局范围内导入一个模块并在闭包中使用它,两者的时间似乎相同,如果不是第一个变体更快的话。

排除非局部变量的意外使用,是否有任何陷阱使这种闭包的使用变得多余或容易出错?

注意:我知道符合“平面优于嵌套”并且此类结构的可读性可能存在争议,但我的问题是针对可读性以外的其他原因。

0 投票
2 回答
53 浏览

javascript - 任何人都可以在另一个函数中解释函数的这种行为吗?

我试图理解 Javascript 中的词法作用域。在下面的示例中,我在另一个函数中编写了一个函数。当我运行它时,我希望在第一个警报中弹出“爸爸”,在第二个警报中弹出“妈妈”。但实际发生的是,它在第​​一个弹出窗口中显示“未定义”,在第二个弹出窗口中显示“妈妈”。

有人可以解释为什么在父函数中定义的变量“x”在子函数中不可见吗?奇怪的是,当我删除子函数中变量“x”的声明时,它工作正常。有人可以深入了解这里有效的词汇范围场景吗?

0 投票
1 回答
1253 浏览

javascript - 在 chrome 开发工具中使用词法范围(闭包)调试 angularjs 指令时的奇怪行为

这是我的代码,带有一个名为 test 的简单指令:

我在 var someText 处添加了断点。然后我尝试通过在“ReferenceError:outerVar 未定义”中输入outerVar 来从开发工具控制台获取值。

但是当我将 myFunc 修改为

我得到了这个值,甚至更多我可以在开发工具控制台上输出来自 outVar 的值,但只有 outVar 而不是像范围、el 和 attrs 这样的外部变量......如果我做一个 console.log对于其他变量,我得到相同的结果——它有效,但在开发工具控制台中无效。

0 投票
1 回答
1056 浏览

r - 在嵌套函数 R 中调用对象

首先,我是一名 R 初学者,目前正在学习 R 编程课程。它在教授 R 的基础知识方面非常缺乏,所以我试图通过 Stack Overflow 上的优秀贡献者来学习自己。我试图弄清楚嵌套函数是如何工作的,这意味着我还需要了解词法作用域的工作原理。我有一个函数可以计算多个 CSV 文件中的完整案例并立即吐出一张漂亮的表格。

我现在试图finally在这个新函数中调用作为上述函数输出的数据帧中的不同变量:

如果没有finally$nobs这个函数,它应该会吐出数据框,但是当我尝试调用nobsobject 中的变量时finally,它说finally找不到 object。我意识到这个问题是由于我对词汇范围的主题缺乏了解,我的教授并没有真正明确词汇范围,所以我不完全确定如何在嵌套函数环境中找到对象......任何帮助会很大。

0 投票
0 回答
93 浏览

r - 自由变量如何影响 R 中局部变量的属性?

我有一个创建函数的构造函数。有一个名为“features”的变量是构造函数的本地变量,另一个名为“features”的变量是由构造函数创建的函数的本地变量。这些在下面的代码中被区分为:

1)## --> 'features' assignment 1 (see question) features <- paramIN

2)## --> 'features' assignment 2 (see question) features[!paramIN] <- p

三个观察;

1)如果我features <- paramIN在返回的函数内部移动但在 之前features[!paramIN] <- p,该程序也可以工作。这是有道理的,因为paramIN它是返回函数内部的一个自由变量,features是返回函数的本地变量,并且在它成为子集和分配之前features <- paramIN声明和初始化。features

2)如果我在返回函数之外使用features[!paramIN] <<- p并保留第一个声明,则程序也可以工作,并且在使用返回函数时更新第一个实例。在这种情况下,就返回的函数而言,两者都是自由变量。看来,返回函数内部是指在返回函数外部声明。一切都很好。featuresfeaturesfeaturesparamINfeaturesfeatures

这是我的具体问题:

3)但是如果我features[!paramIN] <- p按照给定的方式使用,但完全删除features <- paramIN,程序会失败,因为它找不到features. 似乎第一个声明(在返回的函数之外)是建立features一个二元向量所必需的。但是“内部”features是与“外部”不同的变量features;它是返回函数的局部变量,那么如何通过features返回函数外部的声明来确定它的存在和结构呢?

0 投票
1 回答
81 浏览

javascript - Angular:引用当前实例化的控制器

有没有办法从控制器的定义中获取对当前实例化的控制器对象的引用?我想要$compile一个模态并将其绑定到创建模态的同一个控制器。

这是我想做的简化版本,其中THIS_CONTROLLER_INSTANCE是对我的控制器实例的引用。

0 投票
2 回答
264 浏览

javascript - 包含承诺的for循环中的词法范围?

我有一个对象,它将字符串ids映射到对象。idproduct

我正在使用一个用于数据库交互的库,它公开了 Promise(由then上面的函数表示)。我试图打印出函数product内的变量then,但我似乎只得到了最后一个idids所以看起来这是一个范围问题。如何正确确定变量的范围,以便在每个循环product的函数中打印出不同的产品?then