源码阅读:Lodash、AngularJs、Underscore、JQuery 的isFunction

jamie-street-539514-unsplash.jpg

题图来自 Unsplash By Jamie Street

  先从AngularJs 开始吧「最简单」,看起来比较普通>_< 。稍微有点经验的应该都知道typeof 了,这算是常规操作了!

function isFunction(value) {
return typeof value === 'function’;

}

  JQuery 和AngularJs 比较相似「都使用了typeof」,不同的仅仅是多了一个判断。由于有些浏览器「代码注释里面没说」对HTML 的<object> 元素使用typeof 也会返回“function”,所以需要对nodeType 进行进一步的校验。

function isFunction( obj ) {
      return typeof obj === "function" && typeof obj.nodeType !== "number";
}

  Underscore 也和AngularJs 很相似,只是这个方法在某些版本的浏览器上面是不存在的。源码注释上面说是为了兼容旧版的v8>_<

_.isFunction = function(obj) {
    return typeof obj == 'function' || false;
};

  从Underscore 演进过来的Lodash 是最复杂的「应该兼容性最好吧」。Lodash 使用的是toStringTag 或者toString 来判断传入数据的类型。

function isFunction(value) {
    if (!isObject(value)) {
        return false
    }
    // The use of `Object#toString` avoids issues with the `typeof` operator
    // in Safari 9 which returns 'object' for typed arrays and other constructors.
    const tag = baseGetTag(value)
    return tag == '[object Function]' || tag == '[object AsyncFunction]' ||
        tag == '[object GeneratorFunction]' || tag == '[object Proxy]'
}
您的浏览器已过时

要正常浏览本网站请升级您的浏览器。现在升级

×