我的环境是Firefox6.0
其实第一,第三,第四段代码都好理解,关键解释下第2段
<script>
/*
func1();
var function func1(){
  alert(1);
}
//正常弹出
*/func1();
var testfun=function func1(){
  alert(1);
}
//不弹出,Firebug:func1() is not defined
/*
testfun();
var testfun=function func1(){
  alert(1);
}
//Firebug:testfun() is not a function
*//*
testfun();
var testfun=function(){
  alert(1);
}
//Firebug:testfun() is not a function
*/
</script>

解决方案 »

  1.   

    var a = function(){alert("a")}
    var b = a;
    应该理解为a,b 是一样的
      

  2.   

    还是不明白,可否说明白些。其实我想问,对于第二段代码,为什么Firebug说func1没定义。或者说:前两段代码有啥不一样的
      

  3.   

    javascript的预编译时机问题,准确的讲叫初始化同一作用域代码段function fn (){} 的初始化优先级高于 var声明的内容。但在一个方法内部,用var声明的内容会提前被预编译,即:已进入方法优先初始化var声明的部分。这种初始化时机也因个浏览器的不同而有所不同。建议你的做法,只记住正确流程,不必记住反面例子。
      

  4.   

        var b=function a(str) { alert(str); };
        //var b=a;
        b("afsadfsadf");
        a("hell");
    IE8 下是通过的
      

  5.   

    func1();
    var testfun=function func1(){
      alert(1);
    }在IE和其他浏览器的解释不同:其他浏览器下,会把函数声明与函数表达式放一起的语句作为函数表达式处理,即代码中的
    var testfun=function func1(){
      alert(1);
    }
    会被当作函数表达式处理,因此无法被提前调用,但是注意,func1在函数内部是可见的,在外部是不可见的,你可以这样测试下:
    var testfun=function func1(){
      alert(1);
      alert(func1);
    }
    testfun();
    func1();上述代码在非IE下testfunc会先弹出1,再弹出函数代码,说明内部func1是可见的,但是全局调用func1会报错,说明func1在外部是不可见的。
    好了,下面说IE下的情况,IE是把这种情况的代码都做处理,即相当于即用了函数声明,又用了函数表达式,代码被解释为:
    function func1(){
      alert(1);
    }
    var testfunc = func1;这样,func1在外部也是可见的,按照JS函数声明解析机制,func1因此可以在声明前调用。