通过查看self [name]来判断是否定义了Javascript函数 - 这是一个好方法吗?

时间:2008-09-17 22:52:35

标签: javascript

这是This Question的后续问题。

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

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

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

7 个答案:

答案 0 :(得分:7)

试试这个:

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

答案 1 :(得分:6)

您的条件是检查“self”对象中是否存在“sFN”属性。任何非null,undefined,0和“”都将评估为true。

正如其他人所说,你可以使用typeof或instanceof来查看它是否真的是一个函数。

查看您的链接示例,您应该在javascript中阅读== /!=和=== /!==之间的区别。简答:(“”== null)为真,(“”=== null)为假。

答案 2 :(得分: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'))
})()

答案 3 :(得分:1)

仅供参考:typeof有一个很好的陷阱。

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

假设使用FF2的每个人都已升级,那么你就明白了。 但是,这可能是一个牵强附会的假设。

答案 4 :(得分:0)

你无法真正将它包装在一个方法中,但它很简单,实际上没有必要。

function bob()
{}

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

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

答案 5 :(得分:0)

Object.prototype.toString.apply(value)==='[object Function]'

答案 6 :(得分:-1)

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

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');
}