在JavaScript中,代码的执行分为两个阶段。第一步,读取它,并为变量(最初给定值为undefined
)和函数保留空间。在第二阶段,逐行执行。
我还读到,没有使用var
关键字声明的变量被设置为Global
变量。
因此,如果在函数内部定义变量之前先打印变量,则它应该打印undefined
。就像下面的代码一样:
b();
console.log(a);
console.log(d);
var a = 'Hello World!';
function b() {
console.log(c);
console.log('Called b!');
var c = "variable c is printed";
console.log(c);
console.log(d);
d = "Variable d is printed";
}
我希望输出为:
undefined
Called b!
variable c is printed
undefined
Variable d is printed
但是我得到以下输出:
undefined
Called b!
variable c is printed
Uncaught ReferenceError: d is not defined
at b (app.js:12)
at app.js:1
所以我的疑问是,当调用函数b
时,然后在代码执行的第一阶段,应首先为变量d
赋予空间和值undefined
。然后执行应该在第二阶段逐行开始。
答案 0 :(得分:3)
我还读到没有声明var关键字的变量被设置为全局变量。
是的,有点。发生的情况是,如果您进行作业,例如
d = 1;
引擎会遍历所有环境记录(在运行时存储变量值的位置),因此在您的情况下,它首先进入b
的记录,然后到达全球纪录。如果在其中一条记录(如您所说的执行开始时创建的记录)中找到了变量绑定(名称->值),则将值存储在那里。但是,如果到达全局记录,并且在此过程中未找到绑定(变量为未声明),它将在该全局记录处创建新的绑定。
因此,在您进行console.log(d)
时,对d
的绑定不存在,并且访问d
失败。
答案 1 :(得分:0)
在第一阶段,当尝试为变量设置空间时,通过关键字查找它们:
var/let/const
当您在第二阶段崩溃变量指针中不使用它们的空间不使用它时,在函数范围d中没有任何空间及其崩溃点。
此代码显示发生了什么:
console.log(a);
a = 'Some Value For A Variable';
解决它的两个解决方案:
1-使用关键字
console.log(a);
var a = 'Some Value For A Variable';
2-首先初始化
a = 'Some Value For A Variable';
console.log(a);
最佳清晰代码是两个解决方案的复合体: *使用关键字 *定义后调用变量
var a = 'Some Value For A Variable';
console.log(a);
祝你好运