js中定义函数一般有三种方式:

函数声明;

函数表达式(包括命名函数表达式);

使用Function构造函数。

下面,我就自己的知识面聊一聊这三种定义函数的方式。


一,函数声明;

代码1:

function test(){

alert("testok");

}


二,函数表达式;


(1)匿名函数表达式

代码2:

var f=function (){

alert("fffff");

}

一般这样调用它:

f();//alert("fffff");


(2)命名函数表达式

代码3:

var f=function test2(){

alert("fffff");

}

一般这样调用它:

f();//alert("fffff");

注:test2();这样调用在chrome和FF,下面分别会报错,函数未定义,不合法字符。


(3)关于操作符的怪异函数

下面是这两个函数看起来很怪异。

代码4:

~function a(){  

    alert(1111);  

  }();

代码5:

+function a(){  

    alert(1111);  

  }(); 

但是当你把~ +去掉后他们又会报一个SyntaxError的错误。这是因为从语法解析的角度看,


Javascript不允许在函数声明的后面直接使用小括号,而函数表达式则没有这个限制,通过在函数


声明前面加上一个"~“,"+","-","!"操作符,就可以让语法解析器把后面看成是函数表达式。其实


上面的函数可以这样写。

var a=function()

{

 alert(1111);

}();

还有一种,如下:

代码6:

(function () {

    alert("3434324");

})();

这三种当时声明的函数一般都会自动执行。


下面说说函数声明和函数表达式的区别:

javaScript 解释器中存在一种变量声明被提升(hoisting)的机制,也就是说变量

(函数)的声明会被提升到作用域的最前面,即使写代码的时候是写在最后面,也还是

会被提升至最前面。

例如以下代码段:


代码七:


alert(foo); // function foo() {}

alert(bar); // undefined

function foo() {}

var bar = function bar_fn() {};

alert(foo); // function foo() {}

alert(bar); // function bar_fn() {}


输出结果分别是function foo() {}、undefined、function foo() {}和function bar_fn() {}。

可以看到 foo 的声明是写在 alert 之后,仍然可以被正确调用,因为 JavaScript 解释器会将其


提升到 alert 前面,而以函数表达式创建的函数 bar 则不享受此待遇。那么bar 究竟有没有被提


升呢,其实用 var 声明的变量都会被提升,只不过是被先赋值为 undefined 罢了,所以第二个 


alert 弹出了 undefined。


所以,JavaScript 引擎执行以上代码的顺序可能是这样的:

创建变量 foo 和 bar,并将它们都赋值为 undefined。

创建函数 foo 的函数体,并将其赋值给变量 foo。

执行前面的两个 alert。

创建函数 bar_fn,并将其赋值给 bar。

执行后面的两个 alert。




三,使用Function构造函数


代码八:



var sum=new Function ("num1","num2","return num1+num2");


sum();//NAN

sum(1,2);//这样才对

3

从技术角度讲,这也是一个函数表达式,但是不推荐这样方式定义函数,因为这样语法会导致解析


两次代码:第一次解析常规的ECMAScript代码,第二次解析传入构造函数中的字符串,从而影响性


能,不过这种方式对于理解“函数是对象,函数名是指针”的概念倒是非常直观的。


先简单说到这里。由于技术水平有限,请多多指教。