Javascript范围变量

-1 javascript scoping

输出为15(在f中,x为10,y为7),具有以下内容:

var x = 5;
function f(y) { return (x + y) - 2};
function g(h) { var x = 7; return h(x) };
{ var x = 10; z = g(f); console.log(z) };
Run Code Online (Sandbox Code Playgroud)

为什么x取第4行而不是第1行的值(为什么不是第3行)?

Fel*_*ing 5

vars 没有被限制的范围,所以最后一行相当于

x = 10; z = g(f); console.log(z)
Run Code Online (Sandbox Code Playgroud)

现在应该更清楚的是,将值x更改为10 之前 f执行的值.
同样重要的是要注意,在调用函数时,而不是在定义函数时,会计算自由变量.当然,变量的值可以在函数的定义和函数的调用之间改变,就像在您的示例中一样.

在第三行中,x是本地的g,因此完全独立于"外部"变量x.

另请参见JavaScript中的变量范围是什么?


一个更简单的示例演示了这种行为:

var x = 5;
function foo() {
  console.log(x);
}
x = 10;
foo(); // outputs 10
Run Code Online (Sandbox Code Playgroud)