页面重新加载时变量的值发生变化

时间:2016-03-21 07:21:46

标签: javascript firefox firefox-developer-tools scratchpad

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

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

当我第一次使用Run执行上面的代码时,它给出了如下结果:

  

undefined undefined

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

  

0 undefined

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

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

2 个答案:

答案 0 :(得分: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的块范围 所以在第二次运行

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

答案 1 :(得分:0)

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

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