声明:每个人对函数分类的定义不一样,所以这个分类并不是固定的。此篇文章中,笔者只按照自己的理解进行分类哈!
1、有名函数
即普通函数、正常函数,“名”指的是函数名。 声明式和赋值式创建的函数都属于有名函数 执行方式:函数名 | 变量名()
function f1 ( ) {
console. log ( "welcome to my blog" ) ;
}
f1 ( ) ;
var f2 = function ( ) {
console. log ( "thumbs up" ) ;
}
f2 ( ) ;
2、无名函数
非正常函数,没有名字 语法:function(){}
不允许直接存在于代码空间(否则会报错)
2.1、作为变量的“值”存在(赋值式创建函数时的“值”)
var fn = function ( ) {
console. log ( "collection" ) ;
}
fn ( ) ;
是不是对上述代码有疑问?这不是有名函数吗,怎么又变成无名函数了?请注意节标题:作为“值”存在,fn
确实是函数名,但是它的值function(){}
确实也是一个无名函数的形式。
2.2、作为事件处理函数执行
document. onclick = function ( ) {
alert ( "comments" ) ;
}
这里的无名函数也称为事件处理函数,当有绑定的事件类型被触发时,执行这里的代码
2.3、作为函数的参数使用
function fn ( cb) {
cb ( ) ;
}
fn ( function ( ) {
console. log ( "subscribe" ) ;
} ) ;
当一个函数的参数又是一个函数时,这个作为参数的函数叫回调函数
2.4、作为函数的返回值使用
var fn ( ) {
return function ( ) {
console. log ( "thanks for watching" ) ;
}
}
var f = fn ( ) ;
f ( ) ;
在一个函数内部,嵌套了另一个函数,此时就形成了闭包
2.5、作为匿名函数的函数体
; ( function ( ) {
console. log ( "thumbs up" ) ;
} ) ( ) ;
3、匿名函数
;()()
,这是个啥?只要你有疑问,你就知道它为什么叫匿名函数了。当然了,必须要和无名函数配合才能成为完整的匿名函数。 目的是为了生成一个独立的作用域,方便分组。 需要注意的一点是,匿名函数的前面需要加上分号;
,防止出错。大家知道在js中就算你不写分号,程序也不会报错。但是匿名函数在执行时,如果上一行代码没写分号,就会报错。原因我先不说,请看代码,并结合报错信息,试试看自己能不能get到。
var str = "string"
( function ( ) { } ) ( ) ;
原因:js不识别换行,上述代码实际上是这样的形式var str = "string"(function(){})()
,js认为"string"()
是在执行一个函数,但实际上"string"
并不是一个函数。