求大侠解释如下js代码,关于变量作用域
发布网友
发布时间:2022-04-27 03:29
我来回答
共3个回答
热心网友
时间:2022-05-14 15:16
在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。
热心网友
时间:2022-05-14 16:34
你好,其实你只要跟踪一下变量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的值变化也是同样的。
热心网友
时间:2022-05-14 18:08
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的引擎的内部机制决定的,第一次和第二次都是在解释阶段就能执行的,而第三次和第四次有自定义方法,引擎不确定有没有就等解释阶段完成后执行,而自定义方法也是从上到下执行的。