求大侠解释如下js代码,关于变量作用域

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。
温馨提示:答案为网友推荐,仅供参考
第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()函数执行了。再定义,函数sayHI()内部的a不就么有定义了,虽然是全局的。你说一切方法是在解释了之后再统一执行。那sayHI()为什么顺序是第三次呢?还是不大清楚,求指点,谢谢

追答

这是解释JS的引擎的内部机制决定的,第一次和第二次都是在解释阶段就能执行的,而第三次和第四次有自定义方法,引擎不确定有没有就等解释阶段完成后执行,而自定义方法也是从上到下执行的。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网