题目:
var a=1
b=function a(x)
{
x&&a(--x);
}
alert(a);
看这个题目之前我们要了解上一篇文章写到关于三个概念
一、变量声明在进入执行上下文就完成。
b 相当于声明为 var b 或者等价于window.b 因为b作为全局变量 ,而所有的全局变量都是window的属性
二、我们也需要知道函数声明和变量声明也是一样的原来,是在进入执行上下就完成了
函数声明为: function functionName(arg1,arg2) {}
函数表达式: var b=function (arg1,arg2){}
但函数表达式不一样,函数表达式相当于变量赋值一样,这相当于上一次三个概念的第三意思一样:变量声明可以提前(预编译),但变量赋值不可以(预编译)
三、 同一个命名的声明,函数声明会覆盖变量声明
function a(){}
var a;
alert(typeof a) //尽管变量声明再后面(js执行是从上到下,从左到右),但是由于函数声明会覆盖变量声明这说明了函数声明的优先级高于变量声明的优先级
//所以结果会 弹出: function
但是如果变量名赋值的话那就会变得不一样了;因为变量赋值初始化会覆盖函数声明:
function a(){}
var a=1;
alert(typeOf a); 结果会是:number
综合上面的概念,重新回归到上个题目
由于a 作为变量声明 ,而我们所看 b=function a(){}是函数表达式,执行上下问之后a会变成函数声明(在不同浏览器是可以的但是在IE中 a 会变成undefined),所以函数声明会覆盖掉变量声明,但又由于 a作为变量声明赋值了,上面的题目相当于:
var a;
var b=function(x){
x&&b(--x);
}
a=1;
alert(a);
所以结果会:弹出 1