var a = 10;
sayHi();
function sayHi()
{
a = a + 10;
alert(a);
return a;
}
alert(a);
alert(sayHi()+10);
我理解的答案弹出的结果是 20--20--20-30.为什么最后的结果是20-20-30-40.关键就是第三个alert(a)。函数运行到return a这一步之后,明明此时作为全局变量的a已经变成了20.所以第三个alert(a),也就是window.alert(a),应该是20才对啊。怎么是39呢??不明白,求大侠指点
在js中,函数的定义会在编译期确定函数的存在。你可以认为函数被提升到整个js部分的顶部去了。var 声明的变量也会在编译期就绑定到对象上,但值要在执行的时候才能赋予,在执行赋值之前,对象虽然有了某个变量,但该变量的值会是undefined。
来看你的这个代码:
因为sayHi函数在编译的时候就已经被声明了。也就是说,以上来执行sayHi是可以的,同样此时sayHi是确定了的。在sayHi中,首先把全局变量a的值加了10,然后赋值给a,这样全局的a的值就成了20。然后立即alert出a的值,也就是第一次弹出20。
接下来是函数定义,可以跳过。
然后又一次调用了alert(a),此时a的值还是20,所以第二次弹出20。
最后一句是弹出sayHi() + 10,而在弹出这个结果之前,首先要执行以下sayHi函数。在这个函数里,再次给全局a增加了10,也就是a的值变成了30,然后弹出a的值,也就是第三次弹出的是30。
sayHi的返回值也是30,那么最后一句就成了alert(30 + 10),也就是第四次弹出40。
来看你的这个代码:
因为sayHi函数在编译的时候就已经被声明了。也就是说,以上来执行sayHi是可以的,同样此时sayHi是确定了的。在sayHi中,首先把全局变量a的值加了10,然后赋值给a,这样全局的a的值就成了20。然后立即alert出a的值,也就是第一次弹出20。
接下来是函数定义,可以跳过。
然后又一次调用了alert(a),此时a的值还是20,所以第二次弹出20。
最后一句是弹出sayHi() + 10,而在弹出这个结果之前,首先要执行以下sayHi函数。在这个函数里,再次给全局a增加了10,也就是a的值变成了30,然后弹出a的值,也就是第三次弹出的是30。
sayHi的返回值也是30,那么最后一句就成了alert(30 + 10),也就是第四次弹出40。
温馨提示:答案为网友推荐,仅供参考
第1个回答 2013-07-18
你好,其实你只要跟踪一下变量a就可以知道:
var a = 10;sayHi();//sayHi里面执行了一次a=a+10;并且在sayHi里alert(a)此时a=20
function sayHi()
{
a = a + 10;
alert(a);
return a;
}
alert(a);//此时a=20
alert(sayHi()+10); //sayHi里又执行了一次a=a+10;此时a=20+10=30,因为作为函数参数的sayHi具有运行优先权,所以在此时alert(a)是sayHi()里的,所以输出30,最后执行外面的alert(30+10),输出40.
必须要理解的一点就是:
作为函数的function,只有被调用的时候才会去执行function里面的内容,当没有被调用时,function只是相当于做了一个声明,里面的过程(代码)是不会执行的;而每一次被调用时,都会再去执行一次function里面的过程。【理解了最后这点,就能理解a为什么会是20-20-30-40了】
与你同样结构的程序,换成C、java、php。。。等语言,作为全局变量的a的值变化也是同样的。
第2个回答 2013-07-17
var a = 10;
sayHi();//--第三次
function sayHi()
{
a = a + 10;
alert(a); //--第一次
return a;
}
alert(a); //--第二次
alert(sayHi()+10);//--第四次
1JavaScript是逐行解释执行
2切方法调用是在解释之后统一执行。追问
sayHi();//--第三次
function sayHi()
{
a = a + 10;
alert(a); //--第一次
return a;
}
alert(a); //--第二次
alert(sayHi()+10);//--第四次
1JavaScript是逐行解释执行
2切方法调用是在解释之后统一执行。追问
大侠,其实一开始我的疑惑就在这里。函数应该是先定义,再执行,它这里上来就sayHi()函数执行了。再定义,函数sayHI()内部的a不就么有定义了,虽然是全局的。你说一切方法是在解释了之后再统一执行。那sayHI()为什么顺序是第三次呢?还是不大清楚,求指点,谢谢
追答这是解释JS的引擎的内部机制决定的,第一次和第二次都是在解释阶段就能执行的,而第三次和第四次有自定义方法,引擎不确定有没有就等解释阶段完成后执行,而自定义方法也是从上到下执行的。