JS中创建函数的几种方法
本文参考博客–大部分人都会做错的经典JS闭包面试题
1. 声明函数
function fn1(){}
最普通最标准的声明函数方法,包括函数名及函数体。
2. 创建匿名函数表达式
var fn1 = funciton (){}
创建一个变量,这个变量的内容为一个函数
3. 创建具名函数表达式
var fn1 = funciton func_name(){}
具名函数表达式的函数名只能在创建函数内部使用,即采用此种方法创建的函数在函数外层只能使用fn1不能使用func_name的函数名。func_name的命名只能在创建的函数的内部使用
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 (){…} },也属于函数表达式
- 区别:使用var或是非对象内部的函数表达式内,可以访问到存放当前函数的变量;在对象内部的不能访问到。
var o={
fn:function (){
console.log(fn);
}
};
o.fn(); //ERROR报错
var fn=function (){
console.log(fn);
};
fn(); //function (){console.log(fn);};正确
原因也非常简单,因为函数作用域链的问题,采用var的是在外部创建了一个fn变量,函数内部当然可以在内部寻找不到fn后向上册作用域查找fn,而在创建对象内部时,因为没有在函数作用域内创建fn,所以无法访问。
4. 自执行函数
(function(){alert(1);})();
(function fn1(){alert(1);})();
自执行函数属于上述的“函数表达式”,规则相同
5. Function构造函数
可以给 Function 构造函数传一个函数字符串,返回包含这个字符串命令的函数,此种方法创建的是匿名函数。
6. 其他创建函数的方法
当然还有其他创建函数或执行函数的方法,这里不再多说,比如采用 eval , setTimeout , setInterval 等非常用方法,这里不做过多介绍,属于非标准方法,这里不做过多展开