首页 新闻 会员 周边 捐助

js中的传参问题

0
悬赏园豆:30 [已解决问题] 解决于 2015-07-01 12:16

在jquey的源码中

bind: function( types, data, fn ) {
        return this.on( types, null, data, fn );
    }

但是我们调用的时候$("#abc").bind("click",function(){alert("!!!!!")});

还可以这样$("#abc").bind({ "click": function() { alert("wo cao!"); } });

按照C#中就是应该有多个重载方法,但是js中方法不能重载。

上面那两种调用方式为什么会成功呢?

如果只有一个方法,那么这种调用$("#abc").bind("click",function(){alert("!!!!!")});传了2个参数,应该是对应前两个的,但是实际应该是对应第一个和第三个参数的,这是怎么对应上的呢?

木木牛流马的主页 木木牛流马 | 初学一级 | 园豆:105
提问于:2015-06-30 17:31
< >
分享
最佳答案
0

直接找那个on函数的源码看看嘛,不用找了,我直接贴过来:

......
jQuery.fn.extend({

    on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
        var type, origFn;

        // Types can be a map of types/handlers
        if ( typeof types === "object" ) {
            // ( types-Object, selector, data )
            if ( typeof selector !== "string" ) {
                // ( types-Object, data )
                data = data || selector;
                selector = undefined;
            }
            for ( type in types ) {
                this.on( type, selector, data, types[ type ], one );
            }
            return this;
        }

        if ( data == null && fn == null ) {
            // ( types, fn )
            fn = selector;
            data = selector = undefined;
        } else if ( fn == null ) {
            if ( typeof selector === "string" ) {
                // ( types, selector, fn )
                fn = data;
                data = undefined;
            } else {
                // ( types, data, fn )
                fn = data;
                data = selector;
                selector = undefined;
            }
        }
        if ( fn === false ) {
            fn = returnFalse;
        } else if ( !fn ) {
            return this;
        }

        if ( one === 1 ) {
            origFn = fn;
            fn = function( event ) {
                // Can use an empty set, since event contains the info
                jQuery().off( event );
                return origFn.apply( this, arguments );
            };
            // Use same guid so caller can remove using origFn
            fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
        }
        return this.each( function() {
            jQuery.event.add( this, types, fn, data, selector );
        });
    },
......

看完了这段源码,问题应该清楚了吧。

还贴点拓展知识,arguments 对象,看完这个,js的函数重载就能理解了。

收获园豆:30
liqipeng | 小虾三级 |园豆:1160 | 2015-07-01 01:36

看了下,明白了,我之前一直在想他是怎么把参数对应上去了,原来都在on方法里面处理了,判断参数类型,间接实现了函数重载,感谢

木木牛流马 | 园豆:105 (初学一级) | 2015-07-01 12:14
其他回答(2)
0

正如楼上提到的一个知识点 arguments这个类数组对象,如果你仔细阅读过一些js的开源源码,你会发现很多开源库中在处理函数参数时候大多数都是通过arguments这个对象来处理的,很少直接使用字面上的参数列表。 

 

知道了这个我想你的问题也就有了答案了,那么对于所谓函数参数的类型其实就没有任何意义了,这个完全你可以根据arguments对象在内部做校验然后根据不同类型处理了,也就是造成了,我们表层看到了类似函数重载的情况了。

 

js本身是没有重载概念但是确实支持,只是后面的覆盖了前面的function而已

visonme | 园豆:1674 (小虾三级) | 2015-07-01 08:33

是的,是你说的这样,现在明白了,感谢

支持(0) 反对(0) 木木牛流马 | 园豆:105 (初学一级) | 2015-07-01 12:14
0

我在方法体中switch case,算不算重载呢?js里面大概就是这样一个道理,判断参数个数,判断参数类型,执行不同代码,返回不同值,就达到了重载的效果。

幻天芒 | 园豆:37207 (高人七级) | 2015-07-01 08:59

现在明白了,感谢

支持(0) 反对(0) 木木牛流马 | 园豆:105 (初学一级) | 2015-07-01 12:15

@木木牛流马: :)

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2015-07-01 12:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册