直接上代码
var a=1;
var f=function(){
a=2;
};
f();
alert(a);
function f(){
a=3;
}
f();
alert(a);
请问大家,上面的alert 依次弹出什么? 为什么?
直接上代码
var a=1;
var f=function(){
a=2;
};
f();
alert(a);
function f(){
a=3;
}
f();
alert(a);
请问大家,上面的alert 依次弹出什么? 为什么?
全部是两个2,这个主要的问题还是在函数声明提前上,执行上下文中进行了函数的声明,但是到了下面这个函数被覆盖了,也就是说在执行代码前,我们已经对函数进行了声明,到了下面的var f=function(){a=2;};
只是更改了函数的值
var a=1;
alert(a);//1
var f=function(){
a=2;
};
alert(a);//1
f();
alert(a);//2
function f(){
a=3;
}
alert(a);//2
f();
alert(a);//2
f=function(){
a = 5;
};
alert(a);//2
f();
alert(a);//5
看了你的问题,我又验证了下上面代码。分析其原因:函数声明和变量声明会提前到代码的最顶端,变量赋值却是在其本来的位置。所以,上面代码等同于:
var a;
var f;
function f(){
a = 3;
}
a=1;
alert(a);//1
f=function(){
a=2;
};
alert(a);//1
f();
alert(a);//2
alert(a);//2
f();
alert(a);//2
f=function(){
a = 5;
};
alert(a);//2
f();
alert(a);//5
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
两次都是2.
重点:函数声明最先被执行(不是执行内部代码,是方法名被记录下来),然后按照顺利执行函数里面的其他部分。
所以,这段代码的执行顺序是:
function f(){} (将f这个函数名记录下来)
var f=function(){} (执行函数表达式,变量f被赋值)
f(); alert(a); (执行函数f,输出2)
f(); alert(a);执行函数f,输出2)
代码顺序相当于: