函数声明与函数表达式的区别

2018-10-03  本文已影响0人  前端阿良古

函数声明:

hello();
function hello(){
  console.log('这是函数声明!');
}

函数表达式:

hello(); // 这里会报错 Uncaught ReferenceError: hello is not defined
const hello = function(){
  console.log('这里是函数表达式');
}

原因:解析器会率先读取函数声明,并使其在任何地方都可以使用;至于函数表达式,则必须等到解释器执行到它所在的代码行才会被真正解释执行。(其实就是解析器会先声明变量再等执行到所在代码行才初始化)

可以同时使用函数表达式和函数声明,称之为具名函数表达式(Namedfunctionexpression,NFE),这种写法其实没啥用,还容易造成误会。要注意的是:这种语法在Safari中会导致错误

const hello = function hello(){
  console.log('同时使用');
}
hello(); // 同时使用

上面的代码看似没啥问题(就是没什么用而已),但是看看下面这个

const fn = function hello() {
  hello = 1;
  console.log(hello);
}
hello(); // 这里会报错:Uncaught ReferenceError: hello is not defined
fn(); // 这里输出函数本身ƒ hello() {hello = 1;console.log(hello);}

这是因为具名函数表达式有两个特性:

总结:

上一篇下一篇

猜你喜欢

热点阅读