1. JavaScript定义函数的几种方法
常见的四种定义函数的方法如下:
- 使用直接量方式声明命名函数 第一种方式是最常用的方式是
function fun(){}
; - 函数表达式,声明为匿名函数然后赋值给一变量,很常见的方式:
var fun=function(){};
,在这种方式下,function(){}
是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量fun,所以,通过变量fun就可以调用该函数; - 使用function关键字声明命名函数 第三种是将func赋给变量fun,
var fun=function fun(){}
; - 使用Function对象构造方法创建函数,声明fun为一个对象
var fun=new Function();
。
2.几种方法的区别
1. 其实第一种function定义和第三种使用function关键字声明命名函数定义方式差不多,但是仅以声明方式定义的方法,会被声明提前,而第三种方式不会。
如下面这种方式是正确的:
func(1);
function func(a)
{
alert(a);
}
Javascript引擎在解析javascript代码时会‘函数声明提升',当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式。 但是第三种定义方式的在声明前调用是错误的,会提示func未定义:
func(1);
var func = function(a)
{
alert(a);
}
2. 使用Function对象构造方法创建函数可改变且运行效率低
以声明方式和直接量方式定义的方法,方法体固定,无法在运行时动态执行。但是以创建对象方式定义的方法,方法体是字符串,可以在运行时动态创建,修改,并执行字符串格式的方法体。
以创建对象方式定义的方法,因为方法体是字符串,需要再次解析。所以执行效率较另外两种方式较低。
3. 定义匿名函数
匿名函数就是定义时未直接指定名称的函数:
var fun = function(args,arg2){
var sum = arg1+arg2;
}
// 也可以直接定义匿名函数
(function(){
...
})();
函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用。匿名函数只有在被调用时才被初始化,最后面的一对小括号里面可以传参,这种自调用方式不需要调用,会自动执行。匿名函数有一个好处就是,匿名函数内部定义的变量时私有变量,作用域只在当前函数内,不会被外部引入的js同名变量污染。
匿名函数比非匿名函数更节省内存空间:
因为非匿名函数在定义时就已经创建函数对象和作用域链对象,所以,即使未调用,也占用内存空间。匿名函数仅在调用时才会临时创建函数对象和作用域链对象,调用完会立刻释放。
3.总结
在开发中多使用直接量方式function fun(){}
,但是在现在ESlint检查严格模式下,这种定义方式不会被声明提前,如果定义前使用会报警告错误。
匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
在java-web工程中常见jQuery使用时:
(function(arg){}(jQuery))
其实就相当于定义了一个参数为arg的匿名函数,同时jQuery作为参数来调用这个匿名函数,在所有DOM元素加载之前执行的jQuery代码。也就是(function(arg){}(jQuery))
用来定义一些需要预先定义好的函数;而(function(){})
则是用来在DOM加载完成之后执行那些预行定义好的函数。