通过查看self [name]判断是否定义了Javascript函数-这是一个好方法吗?
这是此问题的后续问题。
我喜欢(并理解)那里的解决方案。但是,在我正在使用的代码中,使用了另一种解决相同问题的方法:
function exist(sFN) { if(self[sFN]) return true; return false; }
尽管我不知道该怎么做,但似乎工作正常。它行得通吗?如何?这种方法有什么缺点?我应该从另一个问题切换到解决方案吗?
解决方案
只需使用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')) })()
试试这个:
function exist(sFN) { return (typeof sFN == 'function'); }
条件是检查"自身"对象中是否存在" sFN"属性。任何不为null,undefined,0和""的值都将评估为true。
正如其他人所说,我们可以使用typeof或者instanceof来查看它是否实际上是一个函数。
查看链接的示例,我们应该阅读JavaScript中== /!=和=== /!==之间的区别。简短答案:("" == null)为true,("" === null)为false。
我们不能真的将其包装在一个方法中,但是它是如此简单,实际上并不需要。
function bob() {} if( typeof bob == "function" ) alert( "bob exists" ); if( typeof dave != "function" ) alert( "dave doesn't" );
仅供参考:typeof有一个(或者曾经有)陷阱。
FF2返回typeof(/ pattern /)的"函数"。
FF3,IE7和Chrome都针对同一代码返回"对象"。
(我无法验证其他浏览器。)
假设使用FF2的每个人都进行了升级,那么我们很清楚。
但是,这可能是一个牵强的假设。
我在某处(这里和这里)读到函数是窗口对象的属性,因此我们可以执行以下操作:
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'); }
Object.prototype.toString.apply(value)==='[对象功能]'