0

您将如何检查确实存在并已定义的函数是否为空?例如:

function foo(){
   // empty
}

function bar(){
   alert('something');
   // not empty
}

有没有一种功能或一种简单的方法来检查这个?

4

2 回答 2

3

它不是真的很有用,通常也不是一个好主意,但你可以这样做:

function foo(){

}

function bar(){
   alert('something');
   // not empty
}

console.log('foo is empty :' + isEmpty(foo));
console.log('bar is empty :' + isEmpty(bar));

function isEmpty(f) {
  return typeof f === "function" && /^function [^(]*\(\)[ ]*{(.*)}$/.exec(
     f.toString().replace(/\n/g, "")
   )[1].trim() === "";
}​

小提琴

如果只是检查回调,通常的方法是检查回调是否是一个函数:

if (typeof callback === 'function') callback.call();

编辑:

也忽略评论:

function isEmpty(f) {
  return typeof f === "function" && /^function [^(]*\(\)[ ]*{(.*)}$/.exec(
     f.toString().replace(/\n/g, "").replace(/(\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>)/g, '')
   )[1].trim() === "";
}​

小提琴

于 2012-08-02T16:47:08.727 回答
1

一个函数可以是空的,但仍然可以传递变量。这会在 adeneo 的功能中出错:

function bar(t) { }

修改正则表达式,这是支持变量的相同函数:

function isEmpty(f) {
  return typeof f === "function" && /^function [^(]*\([^)]\)[ ]*{(.*)}$/.exec(
     f.toString().replace(/\n/g, "").replace(/(\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>)/g, '')
   )[1].trim() === "";
}​
于 2012-08-02T17:09:39.607 回答