Javascript检查function是否存在

我遵循这个指南来创build一个新的JS到Flash通信:

所以我的代码如下所示:

function getID( swfID ){ if(navigator.appName.indexOf("Microsoft") != -1){ me = window[swfID]; }else{ me = document[swfID]; } } function js_to_as( str ){ me.onChange(str); } 

现在有时,我的onChange不加载,但目前,萤火虫显示一个

me.onChange不是一个函数

错误,并完全停止。

我希望它能够优雅地降级,因为这不是我程序中最重要的特性。 我尝试了typeof但仍然给出了相同的错误。

任何build议如何确保它存在,然后只执行onChange

(除了尝试抓住一件作品,下面的方法都不行)

尝试这样的事情:

 if (typeof me.onChange !== "undefined") { // safe to use the function } 

或更好(根据UpTheCreek upvoted评论)

 if (typeof me.onChange === "function") { // safe to use the function } 

我有这个问题。

 if (obj && typeof obj === 'function') { ... } 

如果obj碰巧是未定义的,则不断抛出一个引用错误。

最后我做了以下几点:

 if (typeof obj !== 'undefined' && typeof obj === 'function') { ... } 

一位同事指出,检查是否是!== 'undefined' ,然后=== 'function'是多余的。

更简单:

 if (typeof obj === 'function') { ... } 

更清洁,工作很好。

编辑:我不假装知道为什么这个答案是接受的原因。 请改用Andrew Hare提出的解决scheme: https : //stackoverflow.com/a/1042154/42346


这是处理这种情况的一种方法:

 function js_to_as( str ){ try { me.onChange(str); } catch(err) { // Handle error(s) here } } 

如果您使用eval将string转换为函数,并且您想要检查这个eval'd方法是否存在,您需要在eval中使用typeof和函数string:

 var functionString = "nonexsitantFunction" eval("typeof " + functionString) // returns "undefined" or "function" 

不要反过来,尝试一个types的评估 。 如果你做一个ReferenceError会被抛出:

 var functionString = "nonexsitantFunction" typeof(eval(functionString)) // returns ReferenceError: [function] is not defined 

尝试typeof – 寻找'undefined' ,说它不存在, 'function'function”。 JSFiddle这个代码

 function thisishere() { return false; } alert("thisishere() is a " + typeof thisishere); alert("thisisnthere() is " + typeof thisisnthere); 

或者如果:

 if (typeof thisishere === 'function') { // function exists } 

或者在一行中使用返回值:

 var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false"; var exists = (typeof thisishere === 'function') // Returns true or false 

我会再走一步,以确保该属性确实是一个function

 function js_to_as( str ){ if (me && me.onChange && typeof me.onChange === 'function') { me.onChange(str); } } 

没有看到这个build议:me.onChange && me.onChange(str);

基本上,如果me.onChange是未定义的(这将是如果它没有被启动),那么它将不会执行后面的部分。 如果me.onChange是一个函数,它将执行me.onChange(str)。

你甚至可以进一步做:

 me && me.onChange && me.onChange(str); 

如果我是asynchronous的。

怎么样:

 if('functionName' in Obj){ //code } 

例如

 var color1 = new String("green"); "length" in color1 // returns true "indexOf" in color1 // returns true "blablabla" in color1 // returns false 

或者至于你的情况:

 if('onChange' in me){ //code } 

请参阅MDN文档 。

我喜欢使用这种方法:

 function isFunction(functionToCheck) { var getType = {}; return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; } 

用法:

 if ( isFunction(me.onChange) ) { me.onChange(str); // call the function with params } 
 function js_to_as( str ){ if (me && me.onChange) me.onChange(str); } 

没有条件

 me.onChange=function(){}; function getID( swfID ){ if(navigator.appName.indexOf("Microsoft") != -1){ me = window[swfID]; }else{ me = document[swfID]; } } function js_to_as( str ){ me.onChange(str); } 

我会怀疑me没有得到正确的分配onload。

将get_ID调用移动到onclick事件应该照顾它。

显然你可以进一步陷阱,如前所述:

 function js_to_as( str) { var me = get_ID('jsExample'); if (me && me.onChange) { me.onChange(str); } } 

我总是这样检查:

 if(!myFunction){return false;} 

只要把它放在任何使用这个函数的代码之前

 //Simple function that will tell if the function is defined or not function is_function(func) { return typeof window[func] !== 'undefined' && $.isFunction(window[func]); } //usage if (is_function("myFunction") { alert("myFunction defined"); } else { alert("myFunction not defined"); } 

Underscore.js库在isFunction方法中定义了这个方法(其中的注释可能会迎合一些浏览器的bug)

 typeof obj == 'function' || false 

http://underscorejs.org/docs/underscore.html#section-143

这个简单的jQuery代码应该可以做到这一点:

 if (jQuery.isFunction(functionName)) { functionName(); } 

我有这样的情况下,函数的名称根据variables(在这种情况下,var'x')添加到函数名称中变化。 这工作:

 if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); } 

我已经尝试了接受的答案。 然而:

 console.log(typeof me.onChange); 

返回“未定义”。 我注意到规范说明了一个名为'onchange'而不是'onChange'的事件(注意camelCase)。

原来接受的答案更改为以下为我工作:

 if (typeof me.onchange === "function") { // safe to use the function } 

如果你正在检查一个jQuery插件的函数,你需要使用$ .fn.myfunction

 if (typeof $.fn.mask === 'function' { $('.zip').mask('00000'); } 
  function sum(nb1,nb2){ return nb1+nb2; } try{ if(sum() != undefined){/*test if the function is defined before call it*/ sum(3,5); /*once the function is exist you can call it */ } }catch(e){ console.log("function not defined");/*the function is not defined or does not exists*/ }