javascript - 一个function,会不会没有call方法(zepto源码)
伊谢尔伦
伊谢尔伦 2017-04-10 17:24:09
[JavaScript讨论组]
if(isFunction(selector) && selector.call!==undefined){
    this.each(function(idx){
        if(!selector.call(this,idx)) nodes.push(this)
    }) 
}

这个if语句需要检测两个条件:
1.selector 是不是 Function,下面是isFunction的源码:

function isFunction(value) { 
    return Object.prototype.toString.call(value) == 
                                "[object Function]" }

2.判断selector是否具有call方法

分析:
如果isFunction(selector)成立,说明selector是Function的实例,而Function.prototype中包含call方法.那么isFunction(selector)如果为真的话,selector必然有call方法,也就是selector.call!==undefined必然成立.
那么这个逻辑与运算是否多此一举?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(3)
PHPz

极端情况

var selector = function(){...};
selector.call = undefined;
> isFunction(selector) && selector.call!==undefined
false
PHPz

underscore中的实现是这样的:

  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol'], function(name) {
    _['is' + name] = function(obj) {
      return toString.call(obj) === '[object ' + name + ']';
    };
  });
阿神

动态语言就是有这个问题啦,所有都可以随便赋值,所以检查是应该的,你保不准那个二货就给你把call覆盖了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号