还有这样
alert(a);var a = function a(){};alert(a);

解决方案 »

  1.   

    摘自这里很明显,这是一个具名函数的“声明语句”。注意的是,“声明语句”是不返回值的。也
    就是说,声明语句是在语法解释期,由预编译器处理的,而在执行期它是没意义的——没
    有值,也没有返回值。例如单纯的“var X”,是一个声明语句,它就不会返回值,而对于
    “var X=100”来说,JS就处理成一个声明语句,和一个在执行期的赋值语句,它就有返回
    值(后者的值)。上面的规则对于JScript和SpiderMonkey来说都是一样的,这没有区别。有区别的是接下来的
    内容。首先,SpiderMonkey承认“函数表达式(function expression)”,为了直接这样一种
    特性,它约在“函数表达式”中出现的“函数名”是无效的。因为“函数名”是“声明语
    句”来陈述的,而“表达式”是比语句更小(或更低级)的一个级别,因此不可能在“表
    达式”中出现“语句声明”,所以只好在表达式中忽略函数名。
      

  2.   

    JScript承认在代码内文
    的任意位置出现的函数标识符声明。也就是说,由于上面的标识符是有效的,所以全局变
    量中的“X”就会被重写。
      

  3.   

    function a(){}加了括号之后ff就认为它是一个运算元而不是声明语句,里面的a就被忽略了不知是不是这样理解
    模模糊糊的
      

  4.   

    晕了 我用的是ie8 用ctrl+f搜“我的社区”都没搜到