Javascript是一门解释后运行的语言,要弄清楚函数声明的本质,就要知道函数声明会被怎么解释成什么样的语句来执行的。
分两种情况。
1.在{}内单独声明函数,这种语句会解释成将函数赋值给与它的同名变量的语句,并将该条语句上移至它的父语句{}的最顶端。(注:{}符号可以属于函数的也可以属于表达式的,不轮那种都以{}符号为准)
2.表达式(非{}表达式)中的声明函数(如(function fun(){...});var a=function fun(){...}; true?function fun(){...}; return function fun(){...}等等),不进行任何解析,位置也不变。
例1.
函数声明 函数声明解释后 变量声明提升后如上:
function subFun(){}是在{}内单独声明的函数,解释后var subFun=function subFun(){}并将它提升到父语句{}之后。(变量名提升后,与函数解析无关,只是为了方便理解)
例2.
函数声明 函数声明解释后 变量声明提升后如上:
function subFun(){}是{}内单独声明的函数,解释后var subFun=function subFun(){}并将它提升到父语句{}之后。(变量名提升后,与函数解析无关,只是为了方便理解)
例3.
赋值语句,函数声明不进行解释 变量声明提升后如上:
var sub=function subFun(){};表达式,所以它中的函数声明不会进行解释。由于变量声明提升的特性,会将var sub声明部分提升到函数作用域的顶部。
例4.
立即执行语句,不执行解释如上:立即执行函数中function sumFun(){ console.log('a')}在表达式()内,所以不进行任何解释。
例5.
不进行任何解释如上:函数function sumFun(){...}是在?:表达式内所以不进行任何解释。
例6.
报错无法解释如上:根据逻辑var q={function sumFun(){console.log('a')}},但var q={...}这种赋值形式在js中是不存在的(JSX虚拟DOM语言就用这种方式赋值,利用JS没有的东西发明的一种语法。),是会报错的。因此会报错。
假设上面可以解释,function sumFun(){...}在{}内,所以会解析成var sumFun = function sumFun(){...},最后成为下面这样
虚拟解析后以上就是函数声明解释的所有内容,是不是很简单。
网友评论