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