代码之家  ›  专栏  ›  技术社区  ›  James

在JavaScript中测试函数的最佳方法?

  •  2
  • James  · 技术社区  · 16 年前

    我对此做了很多研究,但所用的方法似乎不一致,也不尽相同。

    /* 1: */  typeof myFunc === 'function'
    /* 2: */  myFunc.constructor === Function
    /* 3: */  myFunc instanceof Function
    

    作为研究的一部分,我了解了一些知名图书馆是如何做到这一点的:

     /* jQuery 1.2.6: */  !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
     /* jQuery 1.3b1: */  toString.call(obj) === "[object Function]"
    /* Prototype 1.6: */  typeof object == "function"
          /* YUI 2.6: */  typeof o === 'function'
    

    我很惊讶有这么多不同的方法被使用,确定一个单一的可接受的测试已经达成一致?我完全不知道jQuery1.2.6版本的意图是什么,看起来有点奇怪。。。

    那么,我的问题仍然是,测试函数的最佳方法是什么?

    [*]我所说的“最佳”是指最广泛接受的跨浏览器兼容方法。


    编辑:是的,我知道以前已经讨论过了,但我还是想讨论一下最有效的方法。为什么有这么多不同的使用方法?

    迄今为止的讨论只提到了算子的类型(大部分),但没有人暗示替代方法的有效性。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Borgar    16 年前

    测试对象是否为函数的最佳方法是 typeof myFunc === 'function' . 如果正在使用库,请使用该库的功能测试: jQuery.isFunction(myFunc)

    东西 可以 typeof . 这是非常罕见的,但有一个库来消除这些不一致。jQuery正在解决这些问题:

    • Firefox报告功能与 typeof document.createElement("object")
    • Safari报表具有以下功能: typeof document.body.childNodes
    • 一些IE内置全局函数( alert )以及一些节点方法( getAttribute )报告为“对象”类型。

    instanceof 而不是 类型 绕过其中一些。例如 document.createElement("object") instanceof Function false 在Firefox中。

    您可以在的注释中查看第一个方法的诞生 the original ticket (#3618) changeset 5947 IE memory leaks . 它可能更慢,但更小,更干净。

    就工作方式而言,==和===之间没有太大区别,但严格的评估速度稍快,因此更受欢迎。

        2
  •  2
  •   AnthonyWJones    16 年前

    toString.call(obj) === "[object Function]"
    

    看起来很整洁,但我想不出在任何情况下,如果简单的 typeof 这种方法可能会失败,但也许他知道一些其他人不知道的事情。

    typeof o === "function"
    

        3
  •  1
  •   PhiLho    16 年前

    typeof 因为两个操作数都是字符串?我忽略了一些问题?

    无论如何,我会使用更简单的typeof方法,这似乎是为了实现这一点而做的,并且是可读的。 instanceof