js中的函数声明与函数定义表达式

发表于:
来源:阿酷技术学习
作者:simplefastbest

javascript定义函数有两种方式,一种是函数声明,一种是函数定义表达式。

1,函数声明function declartion,必须以function开头

function do(){

}

在使用时,函数声明提前调用

2,函数表达式Function Expression

var do=function(){

}

二者有何区别,如何使用,从下面的一个例子开始:

do_method()//do declaration
var do_method= function() {
	console.log('do expression')
}
do_method()//do expression
function do_method() {
	console.log('do declaration')
}
do_method()//do expression

出现这种差别和结果的原因,就是javascript两种函数的定义方式,函数声明(function declaration)和函数定义表达式(function expression)的运行机制不同。

  • 在javascript解释器中存在一种变量声明被提升的机制。变量声明被提升,函数声明定义函数的方式也会提升。关于这变量提升看undefined和not defined区别。也就是说函数声明和变量声明会被提升到作用域的最前面。
  • 而用函数表达式创建的函数是在运行时进行赋值,且要等到表达式赋值完成后才能调用
var do_method//函数声明的变量被提升
do_method()//do declaration,执行函数声明定义的函数
var do_method= function() {
	console.log('do expression')
}//运行时执行,此时已经有效了
do_method()//do expression,表达式定义的函数有效了,覆盖函数声明的定义
function do_method() {
	console.log('do declaration')
}
do_method()//do expression表达式定义的函数有效了

为了看清楚本质,我们看下面两个例子,对函数进行分解。

var do_method
console.log(getName)//undefined
do_method()//Uncaught TypeError: do_method is not a function
var do_method= function() {
	console.log('do expression')
}
 var do_method//函数声明的变量被提升
console.log(do_method)//ƒ do_method() {console.log('do declaration')}
do_method()//do declaration,
function do_method() {
	console.log('do declaration')
}

看到函数声明和函数表达式定义函数区别了吧,函数声明定义无论定义在哪里,javascript解释器会把它自动提升,所有有作用域的任何地方都可以调用,函数表达式定义只有在运行时才执行,只有执行完成后,才可以调用。