web 杂谈Web前端之路让前端飞

你不知的 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 ) }'

好了结束!希望对大家有帮助,如果觉得还不错给个喜欢

上一篇下一篇

猜你喜欢

热点阅读