【发布时间】:2015-07-30 13:54:26
【问题描述】:
这是我去测试一种语言是否具有动态名称解析。
function foo() {
function bar() {
print a
}
var a = 10
bar()
}
如果语言使用动态名称解析,代码应该打印 10。否则,它应该抛出一个未定义的错误。
Javascript 打印 10。但是 Javascript 使用变量提升,它将 var a 移动到顶部 foo 并使我的测试无效。
编辑: 如果我们可以在 JS 中删除变量,那么下面将是一个很好的测试:
var a = 5
function foo() {
var a = 10
function bar() {
print a
}
delete a
bar()
}
foo()
如果 JS 静态解析名称,bar 的 a 引用 foo 的 a。由于 foo 的 a 被删除(如果可能的话),bar 将打印 undefined。
如果JS动态解析名字,bar的a会在bar()被调用时动态查找。由于此时 foo 的 a 已被删除,查找将找到全局 a,而 bar 将打印 5。
【问题讨论】:
-
首先,定义“动态名称解析”的含义
-
This question 关于变量作用域可能是您所追求的,或者可以帮助您重新表述您的问题,以便更清楚地了解您的问题?
-
“但是 Javascript 使用变量提升,它将 var a 移动到顶部 foo 并使我的测试无效。”为什么你觉得这会使你的测试无效?
-
@Alnitak 通过动态名称解析,我的意思是对变量的引用直到运行时才附加到实际变量。相反,静态名称解析意味着编译器可以在不运行代码的情况下找出引用指向的变量。例如,如果 Javascript 使用静态名称解析,编译器可以判断 bar() 引用的是 foo 的 a,而不是其他的 a(如全局 a)。
标签: javascript variables late-binding