我的代码是

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之外都没有)


当前回答

我已试过公认的答案;然而:

console.log(typeof me.onChange);

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

将原来接受的答案更改为以下对我有用:

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

其他回答

放两个感叹号,即!!在要检查的函数名之前。如果它存在,它将返回true。

function abc(){
}
!!window.abc; // return true
!!window.abcd; // return false

我怀疑我没有正确地分配onload。

将get_ID调用移动到onclick事件中应该会解决这个问题。

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

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

我更喜欢使用lodash库,如下所示(看起来更干净):

if (_.has(me, "onChange")) {
   // your desired code here
}

// or generic one like

if (_.has(this, "some property or function name")) {
   // your desired code here
}

现代JavaScript来拯救!

me.onChange?.(str)

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

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

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

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

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

没有任何条件

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