javascript - 编程语言中变量提升的优点和缺点是什么?

标签 javascript python c++ scope hoisting

<分区>

下面的 Python 程序 A 输出 1,正如预期的那样,而下面的 Python 程序 B 引发了一个未绑定(bind)的局部变量 x 错误,这是违反直觉的。

  • 程序 A:
def f(): print(x)
x = 1
f()
  • 程序 B:
def f(): print(x); x = 2
x = 1
f()

Javascript 具有完全相同的行为。

  • 程序 A:
function f() { console.log(x); }
let x = 1;
f();
  • 程序 B:
function f() { console.log(x); let x = 2; }
let x = 1;
f();

但是,在这两种情况下,C++ 都按预期输出 1

  • 程序 A:
#include <iostream>
int x;
void f() { std::cout << x; }
int main() { x = 1; f(); return 0; }
  • 程序 B:
#include <iostream>
int x;
void f() { std::cout << x; int x = 2; }
int main() { x = 1; f(); return 0; }

所以所有程序A输出1。一方面,Python 和 Javascript 与 C++ 之间的程序 B 差异源于它们不同的范围规则:在 C++ 中,变量的范围从其声明开始,而在 Python 和 Javascript 中,它从声明变量的 block 的开头开始。因此,在 C++ 中,函数 f 中的打印变量 x 解析为全局变量 x 的值 1,因为它是执行时上下文中的唯一变量。在 Python 和 Javascript 中,函数 f 中的打印变量 x 解析为空,并引发未绑定(bind)的局部变量 x 错误,因为局部变量 x 在这个执行点已经在上下文中,因此它屏蔽了全局变量 x 而没有绑定(bind)到值 2。 Python 和 Javascript 的这种违反直觉的行为也称为变量提升,因为它在 block 的开头“提升”变量声明(但不是定义)。

编程语言中变量提升的优点和缺点是什么?

最佳答案

这更像是语言的产物,而不是面向程序员的特性。

对于python和javascript,new变量意味着在name字典中分配一个条目,直到你真正创建一个对象并赋值它。在 C++ 中,运行时没有名称字典,定义需要实际为对象分配内存(据我们所知,它可能是一个 10MB 的数组)。

如果您真的需要的话,这确实允许 C++ 适应更小的内存占用。否则没有太多理由考虑它。

从开发人员的 Angular 来看,您有一个错误。您的 x 有两个含义。编程已经够难了,因为它不会改变变量对你的意义,所以我会尽可能避免。我认为 C++ 会在某些此类情况下向您发出警告。

在实践中,您会习惯这两种设置。

关于javascript - 编程语言中变量提升的优点和缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63337235/

相关文章:

javascript - 无法将属性传递给 vue.js 中插槽中的组件?

javascript - Object.map lambda 代码可以在 Chrome、Firefox 中运行,但不能在 IE 中运行?

python - 向前和向后遍历字符串,提取交替字符

python - 如何将 Django App 部署到 1and1 (ionos)

c++ - 尽管释放了所有动态内存,但 Matlab MEX 调用中的内存泄漏?

javascript - prototype.constructor 是做什么用的?

javascript - 在 javascript 中选择输入

python - 使用 python/django 安装 lxml 时出现问题

c++ - C++中的构造函数链接

c++ - 程序是如何通过链接器的?