我已经使用下面列出的代码进行了一些测试:
function foo(x) {
alert(y);
}
var y = 'I am defined outside foo definition';
foo();
上面的代码给了我一个警告'我在foo定义之外定义'。
然后另一个测试:
function bar(x) {
alert(x);
}
var x = 'I am defined outside foo definition';
bar();
function bar(x) {
alert(x);
}
x = 'I am defined outside bar definition';
bar();
以上代码都给我一个警告'未定义'。
为什么?
答案 0 :(得分:4)
因为在这两种情况下,您在函数bar
中都有一个本地范围的变量(第一个参数),您没有传递任何值。由于存在本地范围的变量,因此不会检查全局范围以查看是否存在这样的变量。
在这种情况下,您需要在调用bar
时将值传递给参数
function bar(x) {alert(x);}
x = 'I am defined outside foo definition';
bar(x);
在第一种情况下,当您在y
内使用bar
时,y
中没有名为bar
的本地范围变量,因此它会查看父范围以查看是否如果这样一个变量存在,那么访问变量值就是它的工作方式
答案 1 :(得分:2)
这是因为当您声明参数x
时function bar(x) {...}
你是"隐藏"全局变量x。您只能访问参数x
尝试传入全局x
function bar(x) {alert(x);}
var x = 'I am defined outside bar definition';
bar(x); // here the x is the global x that we pass in
// the function gets a reference to the global x
如果我们省略参数,那么全局x将再次可见
function baz() {alert(x); }
var x = 'global var';
baz(); // 'global var'
请注意,全局变量应该在良好的js应用程序中受到限制。
答案 2 :(得分:2)
如果你定义:
var y = 'I am defined outside foo definition';
它将是一个全局窗口变量(如果您在浏览器中使用js),可以全局访问'致电:
window.y
如果您在函数中使用它,例如:
function foo(x) {alert(y);}
它仍然会引用一个全局变量,因为它没有被函数参数遮蔽。
如果将函数定义为:
function foo(y) {alert(y);}
然后y
被函数参数遮蔽(这是btw arguments[0]
的别名)。这意味着此函数内对变量y
的所有引用都将引用参数变量,而不是全局变量。例如:
var y = 'I am defined outside foo definition';
function foo(y) { y = 'something';}
alert(y);
将显示我在foo定义之外定义。
修改强> 如果你有一个功能:
function bar(x) {
alert(x);
}
并尝试使用bar()
调用它,然后函数参数参数x
调整全局变量x
。 JS引擎将查找本地变量x
并且找不到它 - 这意味着您将在警报中收到undefined
消息。