4

这是This Question的后续问题。

我喜欢(并理解)那里的解决方案。但是,在我正在使用的代码中,使用了另一种解决相同问题的方法:

function exist(sFN) {
    if(self[sFN]) return true;
    return false;
}

它似乎工作正常,虽然我不明白如何。它有效吗?如何?这种方法有什么缺点?我应该从另一个问题切换到解决方案吗?

4

7 回答 7

7

试试这个:

function exist(sFN) {
 return (typeof sFN == 'function');
}
于 2008-09-17T22:55:17.257 回答
6

您的条件是检查“self”对象中是否存在“sFN”属性。任何不为 null、未定义、0 和 "" 的内容都将评估为真。

正如其他人所说,您可以使用 typeof 或 instanceof 来查看它是否实际上是一个函数。

查看您的链接示例,您应该阅读 JavaScript 中 ==/!= 和 ===/!== 之间的区别。简短的回答: ("" == null) 是真的, ("" === null) 是假的。

于 2008-09-17T23:00:13.987 回答
3

只需使用typeof.

typeof(foobar)  // -> undefined
typeof(alert)   // -> function

但是,您不能基于 typeof 定义函数,因为您需要传递一个可能不存在的标识符。因此,如果您定义function isfun(sym) { return typeof(sym) },然后尝试调用isfun(inexistent),您的代码会抛出。

有趣的typeof是它是一个操作符,而不是一个函数。因此,您可以使用它来检查未定义的符号而无需抛出。


如果你假设一个函数在全局范围内(即不在闭包内),你可以定义一个函数来检查它,如下所示:

function isfun(identifier) {
  return typeof(window[identifier]) == 'function';
}

在这里,您传递一个字符串作为标识符,因此:

isfun('alert');   // -> true
isfun('foobar');  // -> false

关闭?

这是在闭包中定义的函数的示例。在这里,打印的值为false,这是错误的。

(function closure() { 
  function enclosed() {}
  print(isfun('enclosed'))
})()
于 2008-09-17T22:55:15.683 回答
1

仅供参考:typeof 存在(或曾经)一个很好的陷阱。

FF2 为 typeof(/pattern/) 返回“函数”。FF3、IE7 和 Chrome 都返回相同代码的“对象”。(我无法验证其他浏览器。)

假设所有使用 FF2 的人都升级了,那么你就很清楚了。但是,这可能是一个牵强的假设。

于 2008-09-18T02:26:43.490 回答
0

你不能真正将它包装在一个方法中,但它是如此简单,真的没有必要。

function bob()
{}

if( typeof bob == "function" )
    alert( "bob exists" );

if( typeof dave != "function" )
    alert( "dave doesn't" );
于 2008-09-17T23:10:43.663 回答
0

Object.prototype.toString.apply(value) === '[对象函数]'

于 2008-10-26T09:43:44.470 回答
-1

我在某处(此处此处)读到函数是窗口对象的属性,因此您可以执行以下操作:

if (window.my_func_name) {
    my_func_name('tester!');
}

或弹出窗口:

if (window.opener.my_func_name) {
    my_func_name('tester!');
}

那么一个完整的解决方案:

function function_exists(func_name) {
    var eval_string;
    if (window.opener) {
        eval_string = 'window.opener.' + func_name;
    } else {
        eval_string = 'window.' + func_name;
    }
    return eval(eval_string + ' ? true : false');
}
于 2008-10-23T06:14:02.980 回答