我注意到一些语言,如C、C++、Java、Perl和.NET Visual都有“块”作用域,这意味着变量将只定义在它所声明的特定代码块中。
例如,
if (true) {
int x = 1;
}
std::cout << x << std::endl;此代码将无法编译,因为x仅在if语句创建的块作用域中可见。
错误:“X”未在此范围内声明
但是,像VBA、Python和Javascript这样的语言都有“基于函数”的作用域,这意味着创建新范围的唯一时间是定义新函数时。
例如,
If True Then
Dim x As Integer
x = 1
End If
MsgBox(x)此代码成功运行,x的值在if语句之外可见。
这种类型的范围划分在我看来相当令人困惑,因为从视觉上看,x应该“属于”if语句。
因此,
发布于 2017-02-09 17:18:43
理论上,函数作用域实际上应该更快--变量通常是在堆栈框架中创建的,函数作用域只创建该堆栈帧一次,而块作用域则需要在每个块中重复打开一个新的堆栈帧。
在实践中,有几个事实使最初的假设无效:
因此,从性能的角度来看,我并不认为这两种方法都有好处--正如上面指出的,即使语言要求块作用域,您也可以在技术上实现函数作用域。不过,这可能会浪费一些记忆。
然而,从程序员的角度来看,我确实看到了块作用域的明显优势(不过,这可能仅仅是因为我是使用C和C++等语言长大的)。
https://softwareengineering.stackexchange.com/questions/341906
复制相似问题