繁体   English   中英

JavaScript中的全局变量,不带var定义的变量

[英]Global Variable in JavaScript , variables defined without var

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

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

省略var一词,谁能解释规则?

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

foo( 2 );

在函数中不使用var进行变量声明确实会使它成为全局变量,但是在您的情况下,JavaScript引擎出现了这一行:

console.log( a + b );

在到达此行之前:

b = a;

并且,这是(全局)声明它的行。

而且,因为你没有使用var ,该声明没有提升到代码库(它本来具有的顶部var -你仍然不会得到一个值b因为只有声明将被吊起,不初始化,但不会引发错误),因此您会遇到错误。

在此处查看有关var和吊装的更多信息。

在严格模式下:

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

在非严格模式下:

  • 分配给一个未声明的变量将创建一个全局变量,但是不会被提升
    • 使用var声明变量会创建一个局部变量,并将提升到函数顶部
  • 读取未声明的变量将引发异常

由于您未处于严格模式下,并且在尝试为其分配值之前先读取b ,因此会出现异常。


遵循准则:

  • 始终"use strict"
  • 始终声明变量
  • 如果要在全球范围内声明它们
  • …但是要避免全球化。 如果您认为全局变量很有用,请考虑使用闭包代替。

像这样用var关键字声明的变量一样,不会悬挂以此方式声明的b = a变量。 这意味着,在运行时,编译器读取b的值不是未定义的(就像var b = a ),而是完全不存在的值,从而抛出ReferenceError。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM