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 foo(){
alert('测试是否弹窗')
}()
SyntaxError: Unexpected token )
报错因为分组操作符需要包含表达式
var fnName = function(){...}()
!function(){}()
+function(){}()
-function(){}()
上面的函数当代码执行到此的时候都会立即执行 !+-
重点在这里 两种自执行函数模式
现在看看
// 下面2个括弧()都会立即执行
(function () { /* code */ } ()); // 推荐使用这个
(function () { /* code */ })(); // 但是这个也是可以用的
例如:
// 自执行函数 第一种
(function start(n1,n2){ //不能加函数名称
console.log("这是函数声明方式的自执行的第一种写法,结果为:"+(n1+n2))
})(10,100)//110
// 自执行函数 第二种
(function (n1,n2){ //不能加函数名称
console.log("这是匿名函数的自执行的第二种写法,结果为:"+(n1+n2))
}(10,100))//110
结果是立即调用()里面的函数 可以用function(){}写建立一个私有域 私有域里可以访问全局变量 全局变量却访问不了 私有域内的变量,所以(function(){}())内部的变量不会和外部的变量发生冲突 俗称 匿名包裹器和命名空间