以前忽略了的 函数定义表达式提升 的小细节

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了以前忽略了的 函数定义表达式提升 的小细节相关的知识,希望对你有一定的参考价值。

区别函数定义的两种方式:

var foo = function() {}     //函数定义表达式

function foo() {}              //函数声明语句

  前者有提升现象,后者没有。

 

众所周知,javascript在中有 “变量提升”的现象——在变量声明之前使用该变量就会报错;原因是因为js 是从上到下执行,在使用一个还未定义的变量所以就会报错!

同理:

foo()
var foo = function(){ console.log(1) }

=> VM3022:1 Uncaught TypeError: foo is not a function

at <anonymous>:1:1

  上述中的函数表达式,函数名是一个变量名,变量指向函数对象。和通过var声明变量一样,也会造成提升。foo()还未定义所以报错;

 

 新发现: 

function foo1() {foo()}
var foo = function(){ console.log(1) }

foo1()

//输出: 1

造成提升的真正原因是: javascript是从上到下执行的,由于执行到未定义的变量时就会报错,然而这里的 foo(),虽然写在前面,但是并没有执行。真正的执行,在最后。而在那个时候,代码已经完成了定义,所以不会报错。

 

不过最好的写法是使用函数声明语句

 

以上是关于以前忽略了的 函数定义表达式提升 的小细节的主要内容,如果未能解决你的问题,请参考以下文章

Vue的小细节

PHP好用但又容易忽略的小知识

多线程提升38%,2018年最佳8代CPU台式机评测

kotlin不容忽视的小细节

虚拟化了的网络,让我们多少人忽略了真实的生活

javascript函数篇函数声明提升