在编写简单的函数声明时,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重复它时,第一个结果重复了。
答案 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中变量的范围