JavaScript函数参数和范围

时间:2015-06-10 06:38:23

标签: javascript function scope

我已经使用下面列出的代码进行了一些测试:

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();

以上代码都给我一个警告'未定义'。

为什么?

3 个答案:

答案 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消息。