编辑添加整个钩子
下面的代码是在一个自定义钩子中。当我调用自定义钩子时,我得到一个未捕获的TypeError,告诉我箭头函数不是函数。有人能解释一下我做错了什么,正确的处理方法是什么吗?
const useHook = ({
Id,
}) => {
let Data = {};
arrowFunction(Id); //calling the arrow function a couple lines below
const arrowFunction = (Id) => {
const lakeHook = useLake();
if (Id) Data = lakeHook.getReference(Id);
if (Data.active){
console.log('data', Data);
return Data;
}
}
}
用let和const声明的变量也被提升,但与var不同的是,它们不使用默认值初始化。如果用let或const声明的变量在初始化之前被读取,将引发异常。
文档:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting?retiredLocale=it
您正在尝试读取存储在const arrowFunction中的函数但这是不允许的,因为它是如何在javascript中提升与const变量。因此,在声明之前调用函数需要做的是使用合适的关键字声明它:
arrowFunction(Id);
function arrowFunction(Id){
//logic
}
或者在创建函数后调用它
const arrowFunction = (Id) => {
//logic
}
arrowFunction(Id);
const useHook = ({
Id,
}) => {
const lakeHook = useLake(); // hooks should be called only on top level
let Data = {};
const arrowFunction = (Id) => {
if (Id) Data = lakeHook.getReference(Id);
if (Data.active){
console.log('data', Data);
return Data;
}
}
arrowFunction(Id); //calling the arrow function a couple lines below
return ??? // declare return statement (optional);
}
- 函数表达式不被提升。使用函数声明代替。
- lakeHook应该根据hooks的规则被移到顶层。你可能想要自定义的useHook返回一些东西,所以声明return语句。(可选)