JavaScript中的全局变量,没有var定义的变量

时间:2016-12-20 15:24:30

标签: javascript

下面的函数将返回b is not defined,因为编译器将查找函数,然后进入全局范围以搜索变量b

但是,我假设没有单词var的b定义会自动创建一个全局变量吗?

在省略单词var时,是否可以解释规则?

function foo(a) {    
  console.log( a + b );    
  b = a;
}

foo( 2 );

3 个答案:

答案 0 :(得分:4)

在变量声明的函数中不使用var确实使其成为全局变量,但在您的情况下,JavaScript引擎正在触及此行:

console.log( a + b );
在它到达这一行之前

b = a;

并且,这是宣布它的行(全局)。

并且,因为您没有使用var,所以声明不会被提升到代码库的顶部(与var一样) - 您仍然无法获得b的值,因为只有声明才会被提升,而不是初始化,但它不会抛出错误),所以你得到错误。

详细了解var并悬挂 here

答案 1 :(得分:1)

严格模式:

  • 使用未声明的变量将引发异常

在非严格模式下:

  • 分配到未声明的变量会创建一个全局变量,但这是悬挂
    • 使用var声明变量会创建一个局部变量, 会悬挂到函数顶部
  • 读取未声明的变量将引发异常

由于您未处于严格模式,而您尝试在之前阅读b ,因此您可以为其指定值,您将获得例外。

遵循指南:

  • 始终"use strict"
  • 始终声明您的变量
  • 如果您想要它们,请在全局范围内声明它们
  • ...但尽量避免全球范围。如果您认为全局变得有用,请考虑使用闭包。

答案 2 :(得分:0)

以这种方式b = a声明的变量不会被提升,就像使用var关键字声明的变量一样。这意味着,在运行时,编译器读取b,而不是未定义(如var b = a所发生的那样),但是作为根本不存在的东西,因此抛出ReferenceError。

吊装信息:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting