你不知的 JS 知识普及——“声明式函数”和“表达式函数”的区别
2017-06-09 本文已影响46人
高少辉_骚辉
声明式函数
定义函数的时候,关键字 function 为本语句的第一个关键字时候就是声明式函数。意思就是上一个“;”之后(虽然写 js 的时候可以省略,但是编译时会为你加入)
// 定义一个声明式函数 fn
function fn(){
console.log('fn')
}
fn() // => 'fn'
这里有两个问题需要注意
- 声明式函数不可以匿名,否则会报一个语法错误
- 声明式函数声明成功后,在当前作用于可以访问到
表达式函数
定义函数的时候,只要关键字 function 不为语句的第一个关键字则为表达式函数,也就是存在于表达式中间的函数。
// 举例
(functino fn1(){}) // 在表达式 () 括号内声明了一个表达式函数
!function fn2(){} // 在 ! 非表达式之后声明了一个表达式函数
+function fn3(){}
-function fn4(){}
false? function fn6(){} : '';
var a = function fn5(){} // 正在等号右边声明了一个表达式函数
...
- 表达式函数可以声明匿名函数
- 表达式函数,可以立即执行
- 表达式函数,如果有名字只能在函数作用域中访问到,当前作用域访问不到
匿名函数,就不用多介绍了,学前端的基本都用过,比如:
var fn = function (){} //这里定义了一个匿名函数(表达式函数)
立即执行函数,前端的小伙伴也应该知道,就是直接自己加括号调用
!function (){
console.log('我自己立即执行')
}() // => '我自己立即执行'
如果有名字只能在函数作用域中访问到,当前作用域访问不到?这句话怎么理解呢?直接看例子吧
// 先定义一个表达式函数 fn1,之后在当前作用域查是否有此函数(打印)
(function fn1() {})
console.log( fn1 ) // => 报错,抛出了 ReferenceError 错误,作用域无此变量
// 先定义一个表达式函数 fn2,并且立即执行,然后在函数内部查是否有此函数(打印)
(function fn2() {
console.log( fn2 )
})() // => 'function fn2() { console.log( fn2 ) }'
好了结束!希望对大家有帮助,如果觉得还不错给个喜欢吧