我的代码是

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不加载。Firebug错误

我。onChange不是一个函数

我想优雅地降级,因为这不是我的程序中最重要的特性。Typeof给出相同的错误。

关于如何确保它存在,然后只执行onChange有什么建议吗?

(下面的方法除了try catch one work之外都没有)


当前回答

js库在isFunction方法中这样定义它(评论认为这可能会迎合一些浏览器错误)

typeof obj == 'function' || false

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

其他回答

对我来说,最简单的方法是:

function func_exists(fname)
{
  return (typeof window[fname] === 'function');
}

现代JavaScript来拯救!

me.onChange?.(str)

可选链接语法(?.)解决了这个问题

从ES2020开始使用JavaScript 在Typescript版本3.7

在上面的例子中,如果a me。onChange属性存在并且是一个函数,它被调用。

如果没有我。onChange属性存在,则什么也不发生:表达式只是返回undefined。

注——若有我。onChange属性存在但不是函数,将抛出TypeError,就像在JavaScript中调用任何非函数作为函数一样。可选的链接不做任何魔法,使这个消失。

function js_to_as( str ){
     if (me && me.onChange)
         me.onChange(str);
}
    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*/
    }

我建议使用:

function hasMethod(subject, methodName) {
  return subject != null && typeof subject[methodName] == "function";
}

第一个检查主题!= null过滤掉没有任何属性的null值(null和undefined)。如果没有这个检查,主题[methodName]可能会抛出一个错误:

TypeError:(undefined|null)没有属性

只检查一个真值是不够的,因为0和""都是假的,但确实有属性。

在确认subject不是null之后,你可以安全地访问属性并检查它是否匹配typeof subject[methodName] == "function"。


将此应用到您的代码,您现在可以做到:

if (hasMethod(me, "onChange")) {
  me.onChange(str);
}