我正在Google Chrome上对此进行测试:
function test(){
d = 2;
}
function test2(){
test();
document.write(d);
}
test2();
函数test
中的变量d应该是本地的,所以我无法在函数test2
中访问它,有人可以解释为什么这有效吗?
编辑:
这不重复,因为我在原始问题的正确答案中找不到任何地方使用不带var的变量使其成为全局变量,它被隐含地称为“隐式全局变量的恐怖”
答案 0 :(得分:5)
您实际上从未声明过该变量,因此它不是局部变量。相反,它是一个隐含的全球性。
您应始终使用'use strict';
来表示错误。
答案 1 :(得分:1)
此变量从未声明过,它将自动声明为:
window.d = 2;
答案 2 :(得分:1)
当您编写d = 2
时,您告诉JavaScript编译器将值2分配给变量d。函数测试将在其局部范围内找到是否定义了变量d,并且由于尚未在那里声明它将失败。因此,测试函数将询问它的父范围,如果它已声明变量但父范围也未声明变量d。然后测试函数的父作用域将询问全局作用域是否已声明d并且全局作用域发现没有任何变量d因此它将创建名为d的变量并返回该变量。由于变量d由编译器全局声明,因此您可以在test2中访问它。