JavaScript基础-隐式声明变量

278 阅读1分钟

当我执行这一段代码的时候:

function bar() {
  a = 1;
  console.log(a);
}
bar();

a在这里没有用var或者let声明,那么a现在是一个局部变量还是全局变量呢?

JavaScript深入之变量对象 · Issue #5 · mqyqingfeng/Blog · GitHub里,他说的是"全局对象已经被赋予了 a 属性,这时候就可以从全局找到 a 的值,所以会打印 1。",说明这时a是一个全局变量.

但问题是: 我可以信,但我还想证明一下,看看到底在没在?

这个时候我突然想到,是不是可以在函数外面打印一下a的值,如果这时候没报错,那就证明a确实是全局变量.

function bar() {
  a = 1;
  console.log(a);
}
bar(); // 1
console.log(a);   //1

没有报错,说明a确实在全局变量之中,然后我根据调试的结果,在window的属性中找到了a这个属性!

image.png

这一下立马就印象深刻了.

之后查了查,我觉得这个说的比较详细了:慕课解答区

JS中变量申明分显式申明和隐式申明。
Var i=100  显示申明
i=100  隐式申明
在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量,这一点一定要注意。