javascript: 1.var a; function a(){} alert(a);这里输出function a(){}。

2.var a; function a(){} a=1; alert(a);这里输出1,我想问的是js的作用域链中,同一作用域内函数在变量前,所以1可理解,但2为啥输出1啊,求大神解释。

第1个回答  2012-12-05
js是一种弱类型的语言,1中,输出的是a这个方法,2中,由于你在a方法后,又对a执行了a=1这个赋值操作;所以alert结果是1,那是必然的
第2个回答  2012-12-05
函数a与变量a重名,后面的赋值语句会使前面的函数对象失效,而使a变成一个普通变量.追问

其余的人貌似连作用域链都不知道,你的意思是定义var a:作用域链里有变量a,值为undefined,后面定义了function a(){},作用域链里只有函数a,变量a被覆盖了,后面a=1;时,函数a又被覆盖,a变为变量,值为1吗,麻烦了

追答

具体在JS内部是如何处理这两个a的我还真不清楚,或许函数a和变量a都存在于JS内部,但你在调用时JS无法区分你要调用哪一个,或者说JS只是按他的顺序将找到的第一个返回给你.而这个顺序可能是变量,函数.
JS是预编译机制会使函数定义被优先处理,所以即使改变语句顺序也不会改变输出结果,就好比
var a;
a=1;
function a(){}
alert(a);
结果依然是数值1,而不是函数.
所以要解释这个问题可能要深入研究JS的内部.

本回答被网友采纳
第3个回答  2012-12-05
var a;
function a(){}
a=1;
alert(a);
不知道你问的是什么意思,你上面的代码,函数并没有执行,只是弹出了a而已追问

我没有说要执行函数,可能我没说清楚,我想问的是alert(a)时,js引擎怎么去找a这个变量的值,如果有一个函数和变量同名,js引擎取哪一个,依据啥取

第4个回答  2012-12-18
后面的a把前面的覆盖掉了 正常
相似回答