一.先说说JavaScript函数声明的几种方式
1.函数声明
使用function关键字,并指定函数名。
function a() {
console.info('a****')
}
2.函数表达式
用function关键字声明函数,但是未指定函数名,其实就是一个匿名函数并把这个匿名函数赋予一个变量。
var b = function () {
console.info('b****')
}
其实函数表达式声明也可以指定函数名,不过没什么用。
var b = function () {
console.info('b****')
}
b();//b
var c = function testC() {
console.info('c*******')
}
c();//c
testC();//ReferenceError: testC is not defined
3.匿名函数
使用function关键字声明函数,但是不指定函数名。匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或者闭包等等。
function() {
// coding
}
二.函数声明和函数表达式的不同
1.函数声明可以在当前作用域下提前调用执行,函数表达式需要等执行到该函数后才能执行,不可提前调用。因为JavaScript在加载时会先去加载变量和函数声明,会去赋值。注意赋值操作如果是普通变量,就回直接赋值,如果是函数,只是把函数地址赋予变量,变量成为函数的引用。然后逐行执行JavaScript代码。下面这个例子,函数声明这种写法,在JavaScript加载的时候方法就已经存在于内存中了,而调用则是在之后的逐行执行中走到了这里。
setFn()
function setFn() {
// coding
}
// 正常,函数声明可提前调用
setFn()
var setFn = function() {
// coding
}
// 报错,setFn未保存对函数的引用,函数调用需放在函数表达式后面
2.函数表达式尅直接在函数后面加括号调用。
立即执行函数可能可能看上去不那么习惯,只要记住一点,()表示在加载的时候不仅仅是声明函数,而是把函数执行完。如下面这个例子,除了f以外,其他写法都正确,f报错没有函数名。
var b = function () {
console.info('b****')
}
b();//b
var c = function testC() {
console.info('c*******')
}()
var d = (function() {
console.info('d*******')
}());
(function(){
console.info('e*******')
})()//对
(function() {
console.info('f*******')
}());//错
3.加运算符确实可将函数声明转化为函数表达式,而之所以使用括号,是因为括号相对其他运算符会更安全,可以减少不必要的麻烦。
!function(){
console.log(1)
}()
// 1
+function(){
console.log(2)
}()
// 2
-function(){
console.log(3)
}()
// 3
(function(){
console.log(4)
})()
// 4