在JS中,函数可以分为3中:1)函数声明 FD(FUNCTION DECLARE) 2),函数表达式 FE 3) Function类。
函数声明 FD:这种是最常见的。
function Foo(){}
函数声明在进入上下文时就会创建,所以针FD,在代码结构上往往可以会出现
var fooResult = Foo();
function Foo(){}
即调用者在Foo声明之前都可以。
FD一般出现在程序主体或者其他函数体中,这种函数的函数名不可省略,因为这个函数名本身就是一个函数变量。
一个比较有意思的现象的是,在函数申明的后面(如果有分号;的话,那么在分号之前),可以插入一个表达式,而运行正常,比如
function func(){}(1);
function func(){}1;
function func(){}"Expression";
...诸如此类,另外,可以值得说明的是,只有函数申明后面可以这么做,很简单的一个测试方法类似下面:
function foo(){}1(1); 会提示 number is not a function.
2) 函数表达式 FE
函数表达式一般的形式为 function [Foo](){},即这里的函数名称是可有可无,其实声明了函数名称,除了在这个函数体中可以引用,其他地方尝试调用都是提示UnDefine。
FE的一个优点就是不会“污染”变量对象,因为其Function Name是可有可无的,通常使用的更多的是匿名的方式。
函数表达式常用的情况是为变量或者作为参数传递,另外一种情况就是用作立即执行的,比如:
(function(){ })();
值得说明的是,这里的两个括号,分别是 分组操作符,将一个函数转变为函数表达式,后面的括号是调用一般function的格式。
3)Function类
就是创建Function的对象,用于模拟面向对象。
一些小点总结:
1)js里面,当function中没有return,或者return后面的表达式为空,再或者返回的是基本类型,[number,string,boolean,] null, undefined,返回的是function对象。
2) instanceof 基本类型的变量的结果都是null
3)number + string 遇到这种表达式都会主动调用toString.
4) number - string 这种表达式会主动将string转化为number
5)在尝试转化为numbe时尝试调用valueOf
6) 在尝试转化为string时会尝试调用toString
7)(1,3,4,2) 返回的结果是2,因为括号里面的内容其实是由逗号,组成的表达式,结果是2
8) === !== 都是不转换数据类型;而去掉一个等号(=)后就会尝试数据类型的转换
9)函数声明在进入上下文时已经创建,创建的结果是,函数名称作为一个变量对象存在于当前的执行环境中,即该环境中多了一个以该函数名为名称的变量