有人问我,当我们给变量赋值时会发生什么?
意思是,假设我们有一个变量数据,并为其分配一些值,
var data = 5
后台到底发生了什么?数据的初始值是多少,会发生什么,如何分配值?
我尝试用谷歌搜索文章,但我找不到任何与工作相关的内容,可能是我没有使用正确的关键字。如果有人有任何我可以关注的文章或为我提供一些解释,那就太好了。
因为您使用的是
var
,所以名为 data
的变量首先由解释器在包含功能块的开头创建,此时它的初始值为 undefined
。 这种将声明移动到功能块开头的概念称为“变量提升”。 这个 data
变量将是解释器内部的一块内存。 它可能会在堆栈帧对象内分配。吊装参考:
MDN 上的吊装Javascript 提升基础知识
function x() {
// code here
}
也被提升,因此同一作用域中的两个函数可以互相调用,而不必担心声明顺序。
当解释器执行到声明/赋值行所在的代码时,它将把
4
的值赋给变量。
所以,如果你的代码是这样的:function myFunction() {
var sum = 3 * 4;
console.log(sum * 3);
var data = 5;
console.log(sum * data);
}
myFunction();
那么,解释器内部实际上做的是这样的:
function myFunction() {
var sum = undefined, data = undefined;
sum = 3 * 4;
console.log(sum * 3);
data = 5;
console.log(sum * data);
}
myFunction();
事实上,你甚至可以编写这个(有点难看)的代码:
function myFunction() {
var sum = 3 * 4;
data = 6; // this will not be an error
console.log(data);
console.log(sum * 3);
var data = 5; // the declaration of data is hoisted
console.log(sum * data);
}
myFunction();
因为,这就是解释器处理的方式:
function myFunction() {
var sum = undefined, data = undefined;
sum = 3 * 4;
data = 6; // this will not be an error
console.log(data);
console.log(sum * 3);
data = 5;
console.log(sum * data);
}
myFunction();
let
和
const
是块作用域,而不是函数作用域,如果您尝试在声明之前引用它们,则会出现错误,而var
允许您这样做。 var
有点遗留,很少(如果有的话)有理由再使用 var
。 使用 let
和 const
进行编码更安全。 如果您想要函数范围,您仍然可以将 let
或 const
放在函数的顶层。 但是,您通常应该在使用/需要的块中声明变量(将范围限制为仅需要的范围)。