JavaScript 中如何检查函数是否定义
作者:迹忆客
最近更新:2022/12/15
浏览次数:
使用 typeof
运算符检查函数是否已定义,例如 typeof myFunction === 'function'
。 typeof
运算符返回一个指示值类型的字符串。 如果函数未定义,则 typeof
运算符返回“undefined”并且不会抛出错误。
if (typeof myFunction === 'function') {
console.log('✅ function is defined');
} else {
// 👇️ this runs
console.log('⛔️ function is NOT defined');
}
我们使用 typeof
运算符来检查函数是否已定义。
该运算符返回一个指示值类型的字符串。 这里有些例子:
console.log(typeof (() => {})); // 👉️ "function"
console.log(typeof function () {}); // 👉️ "function"
console.log(typeof null); // 👉️ "object"
console.log(typeof []); // 👉️ "object"
console.log(typeof {}); // 👉️ "object"
console.log(typeof ''); // 👉️ "string"
console.log(typeof 0); // 👉️ "number"
typeof
运算符在与未声明的变量一起使用时不会抛出错误,而是返回字符串“undefined”。
console.log(typeof doesNotExist); // 👉️ "undefined"
但是,如果在使用 let
或 const
关键字声明变量之前使用 typeof
运算符,则会出现错误。
// ❌ Error: Cannot access 'myFunction' before initialization
if (typeof myFunction === 'function') {
console.log('✅ function is defined');
} else {
console.log('⛔️ function is NOT defined');
}
const myFunction = () => {};
在使用 const
关键字初始化函数之前,我们使用了 typeof 运算符。
这将返回一个错误,因为我们正在尝试访问程序中存在但尚未声明的变量。
如果我们使用 let 关键字声明函数,我们会得到相同的结果。
但是
,如果我们使用var
关键字,则不会因为提升在 JavaScript 中的工作方式而出现错误。
if (typeof myFunction === 'function') {
console.log('✅ function is defined');
} else {
// 👇️ This runs
console.log('⛔️ function is NOT defined');
}
var myFunction = () => {};
我们使用
var
关键字声明函数,因此在使用typeof
运算符时没有出现错误,但是运行了 else 块。
这就是使用 var
关键字时在幕后发生的事情。
var myFunction;
if (typeof myFunction === 'function') {
console.log('✅ function is defined');
} else {
// 👇️ This runs
console.log('⛔️ function is NOT defined');
}
myFunction = () => {};
变量的声明被提升到顶部,但是值的赋值仍然保留在原处。
这就是为什么我们没有收到错误,而且变量还没有函数类型的原因。
我们很少会像这样编写或阅读代码,但是了解这些基本概念是件好事。