0

在为简单的函数声明编码时,Firefox Scratchpad 有一个奇怪的行为。

console.log(x);
var x = 0;
var func = function() {
  console.log(y);
  var y = 1;
};
func();

当我第一次使用 Run 执行上述代码时,结果如下:

未定义未定义

但是当我第二次执行它时,它给出了以下结果:

0 未定义

所以我假设该值必须保存在缓存中,但是为什么变量 y 仍然未定义?

此外,当我用 Reload and Run 重复它时,第一个结果被重复了。

4

2 回答 2

1

这都是关于var top-hoisting 的。和函数的块范围

当您第一次运行时,您的代码实际上看起来像这样。

var x;
console.log(x); // undefined as  still x is not defined
x = 0;
var func = function() {
   var y;
  console.log(y); //undefined as still y is not defined
  y = 1;
};
func();

现在,当您第二次重新运行时,状态func()不会改变,因为它func 在第二次运行时重新定义了 So的块范围

var func = function() {
   var y;
  console.log(y); //undefined as still y is not defined 
                  //as scope is re-initializd 
  y = 1;
};

在javascript中,调用每个函数时,都会创建一个新的执行上下文

但与var x; declared and defined in global scope第一次执行时一样,它是从那里获取的。所以,x=0 and y=undefined

于 2016-03-21T07:29:10.893 回答
0

自从您第一次执行该时间以来,在使用它之前没有声明 x 和 y 变量。一旦涉及到第二行 x 就被声明为全局,它保留在您的页面脚本中。但是对于 y 变量,它是在函数内部声明的,它的范围仅限于函数,因此 y 不会是全局的。

因此,当您刷新页面时,x 变量会获得该全局值,但在 y 的情况下则不会。它都是关于 Javascript 中变量的范围

于 2016-03-21T07:30:59.050 回答