函数声明:
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);}
这是因为具名函数表达式有两个特性:
- 具名函数表达式的函数标识符只能在函数体内被访问,函数体外不能被访问
- 具名函数表达式的函数标识符是只读的,不能被赋值
总结:
- 除此之外,函数声明和函数表达式是恒等的
- 推荐使用函数表达式,因为js规范推荐先声明后使用
网友评论