一道js题

阿里面试的时候遇到

var a=1;
a=function(){
    alert('a');
}
a();


var b=2;
function b(){
    alert('b');
}
b();

 

上面的毋庸置疑,结果是弹出a,因为函数表达式覆盖了之前的变量赋值。

下面的就有些纠结,虽然我知道这题是要考函数声明和函数表达式,但是我知道的两者的区别仅在于,解析器会率先读取函数声明,并使其在执行任何代码之前可用

下面的会报错,number is not a function,说明函数声明没有覆盖变量赋值,这是为神马- –

为了找到答案,看下面的代码:

 

var b;
function b(){
    alert('b');
}
b();

和上面的区别在于b没有赋值,结果是弹出b,如果函数声明没有覆盖上面的变量声明,应该报错,b是undefined,不是function。所以,这里的函数声明覆盖了变量声明。

 

于是可以这样理解,函数声明可以覆盖变量声明,但不能覆盖变量赋值?

 

 

 

6 Responses

  1. CJS说道:

    这让我想起了事务..
    我理解的是,
    显示的表现为“函数声明可以覆盖变量声明,但不能覆盖变量赋值”。

  2. 晋文格墨说道:

    var b=2;可以把它看作是一个函数表达式,而不是声明。所以后面的函数声明没有覆盖掉它。

  3. 晋文格墨说道:

    或者可以这样理解,编译器将函数声明移至var b=2之前,所以函数声明被var b=2;覆盖掉了。