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