在javascript中的函数内部声明带有var的变量

时间:2019-10-30 07:35:05

标签: javascript hoisting

在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。然后执行应该在第二阶段逐行开始。

2 个答案:

答案 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);

祝你好运