1.函数声明
2.函数表达式
3.匿名函数
函数声明:function fnName(){,,,} 使用function关键字声明一个函数 再指定一个函数名 叫做函数声明
函数表达式:functioin(){...} 使用function关键字声明一个函数 不指定函数名 最后将函数赋值给一个变量 叫做函数表达式
匿名函数:function(){。。。}使用function关键字声明一个函数,不指定函数名,也不赋值给变量 叫做匿名函数 匿名函数属于函数表达式,匿名函数有很多作用,赋值给一个变量成为一个函数,赋予给一个时间成为一个程序。
函数表达式和函数声明的区别是:
一.函数声明提升,而函数表达式必须等到javascript引擎执行到她所在的行时,才会一行一行的解析函数表达式
二.函数表达式后面可以加括号 表示代码执行到此的时候立即执行,而函数声明不可以
代码示例:
fnName();
function fnName(){
...
}
//正常,因为‘提升'了函数声明,函数调用可在函数声明之前
fnName();
var fnName = function (){
...
}
//报错,fnName还未保存对函数的引用,函数调用必须在函数表达式之后
var fnName=function(){
alert('Hello World');
}();
//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数
function fnName(){
alert('Hello World');
}();
//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
function (){}()
//报错 虽然属于函数表达式 但是未进行复制操作
var fnName = function(){...}()
!function(){}()
+function(){}()
-function(){}()
上面的函数当代码执行到此的时候都会立即执行 !+-
重点在这里
现在看看 (function(){。。。})()
结果是立即调用()里面的函数 可以用function(){}写建立一个私有域 私有域里可以访问全局变量 全局变量却访问不了 私有域内的变量,所以(function(){})()内部的变量不会和外部的变量发生冲突 俗称 匿名包裹器和命名空间