函数声明:
函数声明与函数表达式的异同:
相同点:
函数声明与函数表达式都能执行一样的功能,在这里是输出Hello Word,并且都将整个函数作为一个变量,如果console.log(say)是将整个函数作为say的变量,会输出整个函数体,而console.log(say())才是输出函数里面方法返回值。
例如:
用函数声明和函数都能完成相同的功能,例子这里是输出Hello Word,并且如果只输入函数名(或调用用函数表达式赋值的变量名)后面不加括号都会输出函数体,不过用函数声明的函数体有名字,而用函数表达式声明的是没有名字的,只有一个变量来指向这个函数表达式。
<script>
let say = function() { console.log( "Hello Word" ); };函数表达式
console.log(say);
console.log(say());
</script>
<script>
function say() {
console.log( "Hello Word" );
}
//函数声明console.log(say);
console.log(say());
</script>
不同点:
关于执行时间引发的问题:
1:函数声明不能在后面加()输入参数 ,因为在最开始会对函数声明进行加载,但那时并不能加载括号里的值,无法执行该代码段。
例如:
<script>
function add(a,b) {
console.log( a+b );
}("1,2")
//函数声明 ,不会调用</script>
但是在函数表达式中,却可以执行:
<script>
let add = function(a,b) { console.log( a+b ); }(1,2);函数表达式
//控制台输出3
</script>
因为函数表达式在加载后,便能立刻执行。因此在加载完函数表达式后,在其后面进行赋值能够立刻执行,在控制台中输出。
2;在一个代码块中,函数方法只要声明了,能在改代码块的任何位置调用,类似于java中的static一样,在最开始对所有的方法会进行扫描,后面在代码执行的时候就指的方法名,便能在任意位置调用而函数表达只有在写出表达式后才能生效并调用,类似于java中的变量,需要先声明后调用。
例如:
<script>
console.log(add(1,4));
//console.log(say());//报错
function add(a,b) {
return a+b;
}
let say = function() { console.log( "Hello Word" ); };函数表达
console.log(say());//不报错,输出hello word
</script>
例如在这里分别声明了一个函数和一个函数表达式。
都分别在声明前调用,结果函数声明依旧能调用,并输出了5,而函数吧表达式报错了。这是因为函数声明在进入该代码块中会优先加载,会先扫描一遍该代码块中的函数声明,在依次对代码进行编译。因为先扫过了函数声明,因此对编译器而言。add(1,4)是一个"熟人"可以想在任何位置调用。但是对于函数表达式而已,编译器对他是个陌生人。只有编译器扫描过函数表达式 let say = function() { console.log( "Hello Word" ); };才认识他,所以调用say()只能在函数表达式声明过后才能调用。
关于;(分号)的问题:
为什么函数声明后面不用加分号,而函数表达式后面要加分号呢?
原理很简单:
在代码块的结尾不需要加分号 ;
,像 if { ... }
,for { }
,function f { }
等语法结构后面都不用加。
而函数表达式其本质就是将无名函数当成一个值,用一个新的变量对其进行赋值,原理其实可以等价于 let a =2;一样,自然而然要在赋值后加上分号。