检查变量是否为函数的最佳方法是什么?

时间:2019-12-24 08:44:57

标签: javascript function typeof

我经历了多种方法来检查变量是否为函数,但是我无法弄清优缺点,使用哪个以及为什么。

typeof的情况下,我的比较是否会失败?

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

2)typeof functionToCheck === 'function'

3)functionToCheck.constructor === Function

1 个答案:

答案 0 :(得分:3)

在一个完美的世界中,所有这些都应该返回相同的值。

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来检查功能,因为其结果无法以任何方式更改。