js中同名“函数申明”和“函数表达式”执行顺序

104 阅读1分钟

函数声明

一个标准的函数声明,由关键字function 、函数名、形参和代码块组成。
有名字的函数又叫具名函数

举个例子:

function quack(num) {
for (var i = 0; i < num; i++) {
  	console.log("Quack!")
  }
}
quack(3)

函数表达式

函数没有名称,而且位于一条赋值语句右边,被赋给一个变量。
在语句(如赋值语句)中,以这样的方式使用关键function时,创建的是函数表达式。 
没有名称的函数又叫匿名函数

举个例子:

var fly = function(num) {
	for (var i = 0; i < num; i++) {
		console.log("Flying!");
	}
}
fly(3)

主要思路:先执行“函数声明”,再执行代码

例子1

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

执行顺序:

  1. 执行function foo(){ console.log(2) },进行"函数声明"
  2. 执行var foo = function(){ console.log(1) },声明变量,覆盖之前声明的函数
  3. 调用foo()函数,输出1

例子2

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

执行顺序:

  1. 执行function foo(){ console.log(2) },进行"函数声明"
  2. 调用foo()函数。由于此时foo函数还没有被var foo = function(){ console.log(1) }覆盖,所以输出为2
  3. 执行var foo = function(){ console.log(1) }
  4. 调用foo()函数,因为foo已经被覆盖,此时输出1
  5. 最终输出结果:2、1

参考文章:juejin.cn/post/684490…