这个问题在这里已有答案:
在声明之前调用函数与标准函数声明一起使用
//calling the method prior to declaration...
greeter();
function greeter() {
console.log("Hi there!!!");
}
但它不适用于箭头功能或功能绑定方式。为什么??
//calling the method prior to declaration...
greeter();
const greeter = () => {
console.log("Hi there!!!");
}
因为这是一个函数表达式并且类似于
const greeter = function(){
console.log("Hi there!!!");
}
而这些功能并未悬挂。只有悬挂的东西将变量声明const greeter
。
在JavaScript中进一步阅读hoisting
:
什么是吊装?
从概念上讲,例如,对提升的严格定义表明变量和函数声明已经物理地移动到代码的顶部,但实际上并不是这样。相反,变量和函数声明在编译阶段被放入内存中,但仍保留在编码中键入的位置。
箭头功能未被提升。
实际上它比这复杂一点,这个stackoverflow答案是一个很好的参考:Are variables declared with let or const not hoisted in ES6?
greeter()
的工作原理是因为它是一个函数声明并且它被提升,但是像函数表达式一样,箭头函数不会被挂起。
分配初始化不会被提升。所以你不能提升箭头功能,因为它主要表现得像它一样。见下文:
有用:
greeter();
function greeter(){
console.log("Hi there!!!");
}
它不起作用:
greeter();
var greeter = myFunc; // this assignment will not be hoisting
function myFunc(){
console.log("Hi there!!!");
}
它既不起作用:
greeter();
const greeter = () => {
console.log("Hi there!!!");
}