首先,在此之前需要了解的是,在JS中函数可以分为两种,具名函数(命名函数)和匿名函数。
注意:在低版本IE上无法获取具名函数的name,会返回undefined,建议在火狐或是谷歌浏览器上测试。
或是采用兼容IE的获取函数name方法来获取函数名称:
/**
* 获取指定函数的函数名称(用于兼容IE)
* @param {Function} fun 任意函数
* */
function getFunctionName(fun) {
if (fun.name !== undefined) return fun.name;
var ret = fun.toString();
ret = ret.substr('function '.length);
ret = ret.substr(0, ret.indexOf('('));
return ret;
}
可以得知变量fn1是具名函数,fn2是匿名函数
创建函数的几种方式
说完函数的类型,还需要了解JS中创建函数都有几种创建方法。
最普通最标准的声明函数方法,包括函数名及函数体。
1. 声明函数
最普通最标准的声明函数方法,包括函数名及函数体。
function fn1(){}
2.创建匿名函数表达式
创建一个变量,这个变量的内容为一个函数
var fn1=function (){}
注意采用这种方法创建的函数为匿名函数,即没有函数name
var fn1=function (){}; getFunctionName(fn1).length;//0
3.创建具名函数表达式
创建一个变量,内容为一个带有名称的函数
var fn1=function xxcanghai(){};
注意:具名函数表达式的函数名只能在创建函数内部使用
即采用此种方法创建的函数在函数外层只能使用fn1不能使用xxcanghai的函数名。xxcanghai的命名只能在创建的函数内部使用
测试:
var fn1 = function xxcanghai() {
console.log('in:fn1<', typeof fn1, '>xxcanghai:<', typeof xxcanghai, '>');
};
console.log('out:fn1<', typeof fn1, '>xxcanghai:<', typeof xxcanghai, '>');
fn1();
//out:fn1< function >xxcanghai:< undefined >
//in:fn1< function >xxcanghai:< function >
可以看到在函数外部(out)无法使用xxcanghai的函数名,为undefined。
注意:在对象内定义函数如var o={ fn : function (){…} },也属于函数表达式
4.Function构造函数
可以给 Function 构造函数传一个函数字符串,返回包含这个字符串命令的函数,此种方法创建的是匿名函数。
//注:这是匿名函数,我们采取的执行方法是:自执行
Function("alert(1)")(); //或:new Function("alert(1)")();
//执行JS,alert就会触发
5.自执行函数
(function () {
alert(1);
}) ();
(function fn1() {
alert(1);
}) ();
自执行函数属于上述的“函数表达式”,规则相同
6.其他创建函数的方法
当然还有其他创建函数或执行函数的方法,这里不再多说,比如采用 eval , setTimeout, setInterval 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开。