如何检查函数是否存在于 JavaScript 中?

IT技术 javascript
2021-02-10 07:39:59

我的代码是

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 错误

me.onChange 不是函数

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

关于如何确保它存在然后只执行的任何建议onChange

(下面的方法都没有,除了 try catch 一项工作)

6个回答

尝试这样的事情:

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

或者更好(根据 UpTheCreek upvoted 评论)

if (typeof me.onChange === "function") { 
    // safe to use the function
}
@James,因为该语句实际上undefined在 JavaScript 中引发了异常。我尝试过这个。
2021-03-22 07:39:59
为什么不直接使用if (me.onChange) { // do something }
2021-03-27 07:39:59
@UpTheCreek,作为通用解决方案会有点危险,因为旧版本的 IE 将某些函数视为对象,例如typeof window.alert === 'object'.
2021-04-03 07:39:59
@BornToCode 因为 thenme.onChange可以是任何对 求值的东西true,不一定是函数(例如它可以是布尔值、字符串等)。例如参见jsfiddle.net/j5KAF/1
2021-04-04 07:39:59
=== 'function' 会比 != 'undefined' 好
2021-04-06 07:39:59

我有这个问题。

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

如果 obj 碰巧未定义,则继续抛出引用错误。

最后我做了以下事情:

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

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

更简单:

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

更干净,效果很好。

任何人都知道为什么第一个代码片段会抛出ReferenceError这对我来说似乎不合逻辑。
2021-03-14 07:39:59
@saidfagan 见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/的定义...ReferenceError
2021-03-27 07:39:59
为什么 typeof obj == 'function' 是不够的?;-) 提醒:严格相等测试运算符仅在静态操作数为空或 null 或 0 或受任何类似这样的强制转换时才有意义。
2021-03-31 07:39:59

现代 JavaScript 来拯救你!

2021 年,这将在 JavaScript(和 TypeScript)中通过新的Optional Chaining语法解决*

me.onChange?.(str)

如果onChange存在,它会被调用。

如果onChange不存在,则什么都不发生:表达式返回undefined

所以 for let value = me.onChange?.(str),value如果onChange不存在,则为 undefined

请注意,如果onChange存在但不是函数,它会抛出 aTypeError就像您将任何非函数作为函数调用一样。Optional Chaining 并没有做任何神奇的事情来消除它。

* Optional Chaining 是第 4 阶段的TC39 提案,这意味着它尚未正式包含在 ECMAScript 规范中,但基本上保证会包含在下一个版本中。您现在可以通过 Babel 或 TypeScript 使用它,而且语法不会改变。

这是一个非常好的解决方案我是一名中级 JS 开发人员,我不知道这一点,现在我将一直使用它
2021-03-19 07:39:59

如果您使用 eval 将字符串转换为函数,并且您想检查此 eval 方法是否存在,您将需要eval 中使用typeof和您的函数字符串

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

不要颠倒这个并eval尝试typeof如果你做一个 ReferenceError 将被抛出:

var functionString = "nonexsitantFunction"
typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
这可能是邪恶的,但是当函数名称在变量中时这非常有用。
2021-03-17 07:39:59
您可以在没有 eval 的情况下执行此操作。例子:var a = 'alert'; window[a]('it works');
2021-04-03 07:39:59

怎么样:

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 文档

但是这个解决方案并不是每次都有效:(例如,如果我想知道它lastIndexOf()在字符串中(我们知道,也就是说,但理论上)typeof String().lastIndexOf === "function"它是真的,但它'lastIndexOf' in String是假的。
2021-03-25 07:39:59