我很好奇是否有人可以解释Javascript如何在幕后工作。在这种情况下,搜索变量。假设您在项目过程中分布了50个变量,例如我只是枚举变量:
var one;
var two;
var three;
//...
var fifty;
我的问题是,如果我要调用第四十三个变量,它会从顶部到底部开始搜索变量,直到它找到它为止?所以在这种情况下,它会搜索42个其他变量,直到找到43个变量?如果是这样,在顶部定义最常用的变量不是更好的做法吗?如果这个理论完全错了,也可能是其他人知道它是如何运作的吗?
提前感谢您的帮助,对于完全随机的问题感到抱歉。再次感谢。
答案 0 :(得分:2)
“如果我要调用第四十三个变量,是否会开始从顶部到底部搜索变量,直到找到它为止?” - 否,变量如果没有存储为列表,Javascript编译器会将这些引用存储在当前执行上下文的激活对象中。这些将在 map 结构中进行组织,以便查找特定变量不需要迭代变量集合。 (话虽如此,当我们从低级机器语言(低于C语言)查看Javascript编译器的实现时,可以说从地图中检索引用实际上确实需要一些迭代......)
至于简单的答案:
Javascript会执行名为变量提升的操作。无论在何处写入(在相同的范围/功能中),它都将被提升到顶部并分配undefined
。
function foo() {
bar();
var x = 1;
}
实际上是这样解释的:
function foo() {
var x;
bar();
x = 1;
}
有关详细说明,请参阅此处:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
答案 1 :(得分:2)
您所要求的是口译员内部的。 Javascript引擎很可能有一个表,它可以通过变量标识符查找地址。那是我的猜测。如果你想进一步研究它,你可以找到一些javascript解释器源代码,看看它如何查找变量标识符。
答案 2 :(得分:1)
关于定义JavaScript变量的唯一问题是函数范围。当浏览器的JS引擎解析您的代码时,它会自动将变量定义提升到当前范围的顶部。
(function(){
console.log(somevar); // undefined
var somevar = 1;
})();
实际上与:
相同(function(){
var somevar;
console.log(somevar); // undefined
somevar = 1;
})();
答案 3 :(得分:0)
当您有var
语句列表时,订单无关紧要。在程序中引用变量时,将直接按名称检索其值。
最佳做法是在函数顶部声明所有变量,因为JavaScript变量在整个函数范围内定义,即使它们对应的var
语句出现在函数的底部。