方法一
test = function(){
//...
}方法二
function test(){
//...
}之前也没注意这个细节,一直习惯用方法二,最近看了些别人写的代码,发现,也有不少人用方法一,当然,效果目前我感觉是没区别的,不知道这两种写法,是否真的没半写区别呢?只是个人书写习惯不同而以,还是
js也没系统学过,都是自学的,理论方法理解不深,各位js资深大侠说点看法吧。

解决方案 »

  1.   

    当然有不同呀
    第一种是函数表达式
    第二种是函数声明使用第一种方法,必须写定义,后使用,有着严格的顺序
        
        test();//放在这里就会报错,缺少对象
        var test = function(){
            alert(1)
        };
        //test();//放在这里可以正确执行而函数声明则不同,函数声明在预编译是有优先级,会先编译好函数,只要在相同作用域下,可以在任何地方调用它,因为它会被“置前”
        
        test();//正确执行
        function test(){
            alert(1);
        };
        test();//正确执行
      

  2.   

    是的楼上的说的很对  比如 var fun=function() 
    就类似于你声明一个变量  var str="aaaaaa" ;
    必须得先声明才能调用,否则,小心 又要找不到对象了 
    也就是一个作用域的问题的,不过个人特别喜欢用第一种,感觉语法上比较帅气。
      

  3.   

    主要是一个作用域的区别。
    首先,
    在Javascript定义一个函数一般有如下三种方式:
    函数关键字(function)语句: 
    function fnMethodName(x){alert(x);}
    函数字面量(Function Literals): 
    var fnMethodName = function(x){alert(x);}
    Function()构造函数: 
    var fnMethodName = new Function('x','alert(x);')
    摘自:http://dancewithnet.com/2008/05/07/javascript-anonymous-function/
    fn = function(){
    alert(1);
    };
    function fn(){
    alert(2);
    }
    fn(); // 1 or 2 ?

    函数关键字 在当前作用域中被提升了,编译结果如下

    var fn;
    fn = function(){
    alert(2);
    }
    fn = function(){
    alert(1);
    };
    fn(); // 前面的定义 被 后面的定义 覆盖了,所以alert `1`

    再看下面的几个变形

    ;(function(){
    fn = function(){
    alert(1);
    };
    })();
    function fn(){
    alert(2);
    }
    fn(); // 1 or 2 ?


    ;(function(){
    var fn = function(){
    alert(1);
    };
    })();
    function fn(){
    alert(2);
    }
    fn(); // 1 or 2 ?


    ;(function(){
    function fn(){
    alert(2);
    }
    })();
    fn = function(){
    alert(1);
    };
    fn(); // 1 or 2 ?
    扩展阅读:
    http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/
    http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html
      

  4.   

    不是说函数表达式就没用了。也谈不上什么好处不好处的。主要看个人使用习惯了。它俩唯一的不同就是因为一个优先级的问题导致的。如果你定义一个函数表达式,然后又定义一个同名的函数声明。那不管它们的摆放顺序如何,只要在同一作用域下时,那个同名的函数声明将被函数表达式覆盖使用第一种的也很常见呀,json格式的也可以算吧,像下面两种,功能是一样的
        
        var fn={
            a:3,
            b:2,
            add:function(){
                return this.a+this.b
            }
        };
        alert(fn.a+'+'+fn.b+'='+fn.add())
        var fn=function(){
            return me={
                a:1,
                b:2,
                add:function(){
                    return me.a+me.b
                }
            }
        }();
        alert(fn.a+'+'+fn.b+'='+fn.add())
      

  5.   

    作用域
    var objectTest=function(){   this.print=function(){
           alert("aa");
       }}var ot=new objectTest();
    ot.print();
      

  6.   

    区别大了
    第一种是函数表达式
    第二种是函数定义
    函数定义的会预加载,即代码还没有指向到就已经被加载了
    第二种只有运行到代码时才执行
    举个例子
    alert(x); //undefined
    alert(y); //object
    var x = function() {
    };
    function y() {
    }