定义函数的三种方式:
- 函数声明:function 函数名称(参数){函数体}
- 表达式:var express = function 函数名称(参数){函数体}
- 构造函数:var fun = new function()
一、函数声明
函数声明是以关键字开头的,它有一个明显的特征:函数声明的提升,js在解析代码时将函数声明提升到当前作用域的顶部,所以把函数声明放在调用他的语句后面
foo("hello"); //输出 hello function foo(name){ console.log(name); }
- 函数声明与表达式的区分
就是看关键字function在声明中的位置,他的位置是整个函数中的位置,如果function是声明中的第一个位置,那就是函数声明,否则就是表达式
1 (function(){...}());//函数表达式 2 3 +function test(){...}//函数表达式 4 5 (function(){//function既不是函数声明也不是函数表达式,只是一个参数 6 ... 7 },1000);
2.差异
名称和标识符的绑定位置
1 var a = 2; 2 function foo() { 3 var a = 3; 4 console.log( a ); // 3 5 } 6 foo(); 7 console.log( a ); // 2 8 9 /*---------*/ 10 11 (function foo(){ 12 var a = 3; 13 console.log( a ); // 3 14 })(); 15 console.log( a ); // 2
第一个片段中的foo被绑定在所在作用域中,可以通过foo()来调用,第二个片段中foo被绑定在函数表达式自身的的函数中而不是作用域中
也就是说匿名函数作为函数表达式意味着foo只能在它所代表的位置访问,也就是指局部作用域,优点就是不会被全局污染
二、匿名与具名函数
- 具名函数和匿名函数的区别:看关键字·function后的函数名称,有函数名称的是具名函数,没有的是匿名函数
1 setInterval(function(){//匿名函数 2 ... 3 },1000); 4 5 8 9 var funA = function(){//匿名函数表达式 10 ... 11 } 12 13 var funB = function test(){ 14 ... 15 }
三、立即执行函数
1 var express=function () { 2 3 console.log("hello word!"); 4 5 }(); //运行,发现函数直接执行,结果输出了"hello word!" 6 7 8 9 function () { 10 11 console.log("hello word!"); 12 13 }(); //报错 Uncaught SyntaxError: Unexpected token ) 14 15 // 因为以function开头,认为是函数声明,结果没有函数名,就报错了 16 17 18 19 function foo() { 20 console.log("hello word!"); 21 }(); //报错 Uncaught SyntaxError: Unexpected token )
在函数表达式后面紧跟一小括号(),函数就会立即执行,两大要点:表达式、括号()
(function 函数名称(可写可不写) (参数){函数体} ());
立即执行函数只要知道只有表达式才能执行,函数表达式也会被执行,其他除外