关于告诉是否通过查看self [name]定义了Javascript函数:告诉是否通过查看self [name]定义了Javascript函数-这是一个好方法吗?

关于告诉是否通过查看self [name]定义了Javascript函数:告诉是否通过查看self [name]定义了Javascript函数-这是一个好方法吗?

Tell if a Javascript function is defined by looking at self[name] - is this a good way?

这是此问题的后续问题。

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

1
2
3
4
function exist(sFN) {
    if(self[sFN]) return true;
    return false;
}

尽管我不知道该怎么做,但似乎工作正常。 能行吗 怎么样? 这种方法有什么缺点? 我应该从另一个问题转向解决方案吗?


尝试这个:

1
2
3
function exist(sFN) {
 return (typeof sFN == 'function');
}

您的条件是检查"自身"对象中是否存在" sFN"属性。任何不为null,undefined,0和"的值都将评估为true。

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

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


只需使用typeof

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

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

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

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

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

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

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

关闭?

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

1
2
3
4
(function closure() {
  function enclosed() {}
  print(isfun('enclosed'))
})()

仅供参考:typeof有一个(或曾经有)陷阱。

FF2返回typeof(/ pattern /)的"函数"。
FF3,IE7和Chrome都针对同一代码返回"对象"。
(我无法验证其他浏览器。)

假设使用FF2的每个人都进行了升级,那么您很清楚。
但是,这可能是一个牵强的假设。


Object.prototype.toString.apply(value)==='[对象功能]'


您不能真的将其包装在一个方法中,但是它是如此简单,实际上并不需要。

1
2
3
4
5
6
7
8
function bob()
{}

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

if( typeof dave !="function" )
    alert("dave doesn't" );


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

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

或弹出窗口:

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

完整的解决方案是:

1
2
3
4
5
6
7
8
9
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');
}

推荐阅读