下面的函数将返回b is not defined
,因为编译器将查找函数,然后进入全局范围以搜索变量b
。
但是,我假设没有单词var
的b定义会自动创建一个全局变量吗?
在省略单词var
时,是否可以解释规则?
function foo(a) {
console.log( a + b );
b = a;
}
foo( 2 );
答案 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