一、js函数分两种
1)声明函数:function funcName(){};
2)函数表达式 var add=function(){};
注意:
1、在js解释器中,如果遇到函数声明,会自动提升函数声明,这是函数的一个重要特征,解释器会优先读取函数声明,所以我们在代码中,可以把函数放在调用语句的后面。而不会报出:xxx is undefined.
1 add(1,2); 2 function add(a,b){ 3 console.log(a+b); 4 }
2、函数表达式,在调用的时候,必须先赋值负责会报错 undefined。因为函数表达式需要赋值给一个变量才能进行调用。所以没进行赋值的时候,直接进行调用会出现报错。
1 add(1,2); 2 var add=function (a,b){ 3 console.log(a+b); 4 }
报错:Uncaught TypeError: add is not a function。
造成这种现象是因为解析器在向执行环境中加载数据中,解析器会率先读取函数声明,并使其在执行任何代码前可用,至于函数表达式,则必须等到解析器,执行到他的所在的代码行,才能真正的被解析。函数表达式中,创建的函数叫做匿名函数,function之后无标识符即函数名字。
二、匿名函数的执行方法:
1)变量赋值:直接通过 varName()进行调用。
1 var add=function (a,b){ 2 console.log(a+b); 3 } 4 add(1,2);
2)匿名函数另一种方法调用:使用小括号进行包裹匿名函数,在小括号后面加小括号进行调用。
1 (function (){ 2 console.log(1) 3 })()
这种形式调用,我们经常会看见,尤其在插件中看到, 我们在写工厂函数的时候结合这种执行方式。
1 var myUtil=( 2 function(){ 3 function add(a,b){ 4 console.log(a+b) 5 }; 6 function isFunction(a){ 7 return a instanceof Function 8 }; 9 function isArray(c){ 10 return c instanceof Array; 11 } 12 return { 13 add:add, 14 isFunction:isFunction, 15 isArray:isArray 16 } 17 } 18 )() 19 myUtil.add(1,2);
这种方式比较好,避免我们定义的函数的被其他作用域污染。
这种执行方式:()() 在解析器读到这块代码的的时候,会执行该函数,所以我们在调用其中的方法的的时候不需要 myUtil() 因为匿名函数已经 执行完并赋值给myUti 直接进行调用即可。
3、自执行函数:
自执行函数,即定义和调用合为一体。我们创建了一个匿名函数,并立即执行它,由于外部无法引用他的内部变量,因此在执行完之后就会被释放
关键这种机制不会污染全局对象。
在我们查看一些编码和组件的时候会看到一些其他方式的自执行函数:
1)匿名函数后面直接跟小括号也会立即执行。或者直接小括号包裹匿名函数在跟着小括号也是立即执行。
1 (function(){ 2 console.log(2) 3 }())
1 (function(){ 2 console.log(2); 3 })()
2)由于小括号和js的&&、异、逗号等操作符是在函数表达和函数声明生消除歧义的,所以一旦解析器认为一个是表达式默认另一个认为是表达式。
1 0,function(){ 2 console.log(2) 3 }() 4 || function(){ 5 console.log(22) 6 }() 7 true && function(){ 8 console.log(222) 9 }() 10 var a=function(){ 11 console.log(2222); 12 }()
3)如果不关心返回值以及不易读也可以在前面加一些一元操作符。
1 +function(){}( 2 console.log(111) 3 ) 4 -function(){ 5 console.log(222); 6 }() 7 % function(){ 8 console.log(333) 9 }()