如何最好地检查变量是否为函数?

3

我尝试了多种方法来检查变量是否为函数,但是我无法弄清楚各种方法的优缺点,应该使用哪种方法以及原因。

typeof的情况下,有没有任何边缘情况会导致我的比较失败?

1)function isFunction(functionToCheck) { return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]'; }

2)typeof functionToCheck === 'function'

3)functionToCheck.constructor === Function


嗨。也许这个链接对你有帮助 https://www.geeksforgeeks.org/how-to-check-a-variable-is-of-function-type-using-javascript/ - Prashanth Reddy
1
这个回答解决了你的问题吗?检查变量是否为函数类型 - laktherock
使用 typeof method_to_evaluate === 'function' - ArUn
1个回答

4
在理想的情况下,它们都应该返回相同的值。

const functionToCheck = () => {};


console.log(isFunction(functionToCheck));
console.log(typeof functionToCheck === 'function');
console.log(functionToCheck.constructor === Function);
console.log(functionToCheck instanceof Function);


function isFunction(functionToCheck){
  return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}

在现实世界中,它们的差异可能很大。

const functionToCheck = () => {};

// Altering `.toString()` function by some third-party code
Object.prototype.toString = function(){
  return '[ABCDEFG]';
}

// Mistake of programmer
functionToCheck.constructor = HTMLElement;

// Having a global scope variable named `Function` by some third-party code
window.Function = class ABC {};


console.log(isFunction(functionToCheck));
console.log(typeof functionToCheck === 'function');
console.log(functionToCheck.constructor === Function);
console.log(functionToCheck instanceof Function);


function isFunction(functionToCheck){
  return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
}

正如您所看到的,我可以自由地修改函数和构造函数,从而改变您所期望的结果。

最安全的方式是始终使用typeof来检查函数,因为其结果不能以任何方式被更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接