问题标签 [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.
scope - 动态范围的优点是什么?
我了解到静态作用域是唯一明智的做事方式,而动态作用域是魔鬼的工具,仅由解释器/编译器的不良实现造成。
然后我从Common Lisp vs. Scheme文章中看到了这个片段:
为什么 Common Lisp “在这一点上获胜”?使用动态作用域更容易做哪些事情?我真的无法证明需要它/将其视为一件好事。
objective-c - 我的对象范围有问题吗?
这是我正在编写的程序(我自己而不是复制别人的,因此不学习)作为 ObjectiveC 和 Cocoa 学习曲线的一部分。我想在 NSView 上绘制简单的形状(现在限制为椭圆和矩形)。这个想法是我将每个 NSBezierPath 记录到一个 NSMutableArray 中,这样我还可以调查/实现保存/加载、撤消/重做。我有一个画布,可以在上面画画,还有 2 个用于选择工具的按钮。为了处理路径,我创建了另一个对象,该对象可以保存每个绘制对象的 NSBezierPath、颜色值和大小值。这就是我要存储在数组中的内容。我使用 mouseDown/Dragged/Up 来获取绘图路径的坐标。然而,这就是事情变得不稳定的地方。我可以实例化应该保存路径/颜色/等的对象。info 但是,当我尝试更改实例变量时,应用程序崩溃,调试器中没有有用的消息。我会尽量缩短我的代码片段,但如果我需要包含更多,请告诉我。代码也因为我尝试了很多事情来使它工作而退化了一点。
项目:基于 Cocoa 文档的应用程序
我有以下 .m/.h 文件
MyDocument:NSDocument
- 由 XCode 生成DrawnObject:NSObject
- 处理绘制的对象,即路径、颜色、类型(椭圆/矩形)和大小Canvas:NSView
- 好吧,显示绘图,处理鼠标和按钮
Canvas 还负责维护NSMutableArray
对象DrawnObject
。
DrawnObject.h
看起来像这样:
Canvas.h
看起来像这样
在Canvas.m
文件中有几个函数来处理鼠标和 NSView/XCode 也放入了
,
-(id)initWithFrame:(NSRect)frame-(void)drawRect:(NSRect)rect
最初我mouseUp
用来尝试将新DrawnObject
的插入到数组中,但这导致了崩溃。所以,现在我使用两个BOOL
标志来查看鼠标何时被释放(笨拙但我正在尝试......)drawRect
插入到数组中。我已经包含了下面的方法,并指出了它导致应用程序失败的位置:
我想这与对象范围或其他东西有关,但我就是想不通。正如我所说,当我尝试过一些事情时,代码已经发生了某种变化,遗憾的是不是更好。像那些 BOOLS 等。
帮助!任何聪明的人,请指出我正确的方向!
添加这个:
haskell - Haskell 使用什么类型的作用域?
我试图弄清楚 Haskell 是使用动态范围还是静态范围。我意识到,例如,如果您定义:
然后定义函数
您有 2 个不同的“x”,这是否意味着它是动态范围的?如果不是,它使用什么范围,为什么?
此外,Haskell 变量可以有别名(相同内存位置/值的不同名称)吗?
谢谢。
javascript - var self = 这个?
使用实例方法作为事件处理程序的回调将范围this
从"My instance"更改为"Whatever just called the callback"。所以我的代码看起来像这样
它有效,但这是最好的方法吗?我觉得很奇怪。
c# - 在 FOR 循环中声明变量
生产中发生了一个奇怪的错误,我被要求调查。
该问题被追踪到在 For 循环中声明的几个变量,并且没有在每次迭代中初始化。假设由于它们声明的范围,它们将在每次迭代时“重置”。
有人可以解释为什么他们不会)?
(我的第一个问题,真的很期待回复。)
下面的示例显然不是问题代码,而是反映了场景:
请原谅代码示例,在编辑器预览中看起来很好??
编辑:
抱歉,因为托儿问题不得不赶出去。问题在于,prod 代码的 switch 语句很大,并且在某些“情况”下,正在检查类的属性,例如 if (myObject.Prop != null) 然后 testString = myObject.Stringval。 .. 在切换结束时,(外部)对 testString == null 进行了检查,但它保存了上次迭代的值,因此不像编码器假设的那样为 null,并且在循环中声明了变量。
抱歉,如果我的问题和示例有点不对劲,当我把它放在一起时,我接到了关于日托的电话。我应该提到我比较了循环内外两个变量的 IL。那么,是否普遍认为“变量显然不会在每个循环上重新初始化”?
更多信息,变量 WHERE 在每次迭代中被初始化,直到有人对 ReSharper 过度热情指出“从未使用过该值”并删除它们。
编辑:
各位,谢谢大家。作为我的第一篇文章,我看到我将来应该更加清晰。我们意外变量分配的原因可以归咎于一个没有经验的开发人员做 ReSharper 告诉他的所有事情,并且在他对整个解决方案运行“代码清理”后没有运行任何单元测试。查看 VSS 中这个模块的历史,我看到变量 Where 声明在循环之外,并且在每次迭代时初始化。有问题的人希望他的 ReSharper 显示“全绿色”,因此“将他的变量移近赋值”然后“删除多余的赋值”!我认为他不会再这样做了……现在要在周末运行他错过的所有单元测试!
如何将问题标记为已回答?
python - 关于python的变量作用域的一个小问题
我是python的初学者,有一个问题,让我很困惑。如果我先定义一个函数但在函数内我必须使用在下面另一个函数中定义的变量,我可以这样做吗?或者如何将另一个函数的返回内容导入到函数中?例如:
python - 首次使用后重新分配时局部变量上的 UnboundLocalError
以下代码在 Python 2.5 和 3.0 中都按预期工作:
但是,当我取消注释 line (B)时,我得到一个UnboundLocalError: 'c' not assigned
at line (A)。a
和的值b
打印正确。这让我完全困惑有两个原因:
为什么在(A)行出现运行时错误,因为(B)行后面有一个语句?
为什么变量
a
并按b
预期打印,而c
引发错误?
我能想到的唯一解释是局部变量c
是由 assignment 创建的c+=1
,它甚至在创建局部变量之前就优先于“全局”变量c
。当然,在变量存在之前“窃取”范围是没有意义的。
有人可以解释这种行为吗?
programming-languages - 适用于范围分析器的良好 API
我正在开发一些代码生成工具,很多复杂性来自于范围分析。我经常发现自己想知道诸如
- 函数或块的自由变量是什么?
- 这个符号在哪里声明?
- 这个声明掩盖了什么?
- 这种符号的使用是否可能在初始化之前发生?
- 这个变量有可能逃脱吗?
我认为是时候重新考虑我的范围界定问题了。
我可以完成所有这些分析,但我正在尝试找出一种构建 API 的方法,以便它易于使用,并且理想情况下,可以懒惰地完成足够多的这项工作。
人们熟悉哪些类似的工具,他们在 API 中做对与错的地方是什么?
c# - 内部方法和数据结构。
如果我有一个受保护的方法,我可以传入一个数据类型声明为内部的参数吗?
c# - LINQ 查询 - 需要解释为什么这些示例不同
我正在阅读“LINQ Pocket Reference”一书,有一个特定的示例(下面稍作修改)我很难理解......书中的解释有点简短,所以我想知道是否有人可以为我一步一步地分解它,这样它才有意义......
输出这个:
这对我来说很有意义......但是,这不是。
这不...
有人可以更好地解释这里到底发生了什么吗?