先看下下面这段代码,如果你明白问题会是下面的输出才能够回答出来我的问题。因为我的问题就是为什么下面的代码会有这样的输出>_<。另外f跟foo不是恒等吗,为什么可以通过f()调用函数,却不能通过foo()来调用呢?var f = function foo() {
alert(f===foo);   //true
function foo2() {
alert("foo2");
}
}window.onload = function() {
f();
        foo();  //foo is not defined 
        foo2(); //foo2 is not defined 
}
JavaScript函数

解决方案 »

  1.   

    这是个作用域问题var f = function foo() {
        alert(foo);   //true
        function foo2() {
            alert("foo2");
        }
    }
    foo(); //ie 下是可以调用成功的哦,而火狐浏览器不行,因为作用域不同啊,火狐浏览器认为 foo 的作用域只在函数内部,ie 觉得,foo 是全局变量啊
    f(); //可以,因为 f 无论 ie 还是火狐,都觉得它是全局变量啊
    foo2(); //不可以啊,因为 foo2 的作用域在 function foo()内啊,js变量作用域查找原则是就近查找,找不到向外查,不会向内部函数查的啊
      

  2.   

    foo();  //foo is not defined 
    不能调用,是因为根据规范
    以foo作为函数名字的函数表达式。即这个名字只在新定义的函数的作用域中有效——规范要求标识符不能在外围的作用域中有效。---来源于#1的链接。
    foo2(); //foo2 is not defined 
    because请看#2的解答。
      

  3.   

    这个要指明是函数。如果是变量的话,没有使用var,还是会
      

  4.   


    在IE中确实还是能够调用,因为在IE中foo和f是不同的引用,IE都把他们当做全局变量。在firefox和chrome中,他们是同一个引用,但作用域会不同,f是全局作用域,foo只在该函数内部有效。为什么,那是因为规范就是这么定的,只是IE没按规范实现而已。