首页 > 代码库 > 以前忽略了的 函数定义表达式【提升】 的小细节

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

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

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(),虽然写在前面,但是并没有执行。真正的执行,在最后。而在那个时候,代码已经完成了定义,所以不会报错。

 

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

 

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