JavaScript 函数参数和作用域

Gab*_*是好人 4 javascript scope function

我用下面列出的代码做了一些测试:

function foo(x) {
    alert(y);
}
var y = 'I am defined outside foo definition';
foo();
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我一个警告“我被定义在 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();
Run Code Online (Sandbox Code Playgroud)

以上两个代码都给我一个警告“未定义”。

所以为什么?

Aru*_*hny 6

因为在这两种情况下bar,您在未向其传递任何值的函数中都有一个局部作用域变量(第一个参数)。由于存在局部作用域变量,因此不会检查全局作用域以查看此类变量是否存在。

在这种情况下,您需要在bar调用时将值传递给参数

function bar(x) {alert(x);}
x = 'I am defined outside foo definition';
bar(x);
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,当您在y内部使用时bar,没有调用局部作用域变量y,bar因此它会查看父作用域以查看是否存在此类变量,如果这样访问变量值,则它是如何工作的