在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个参数,应该是对应前两个的,但是实际应该是对应第一个和第三个参数的,这是怎么对应上的呢?
直接找那个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的函数重载就能理解了。
看了下,明白了,我之前一直在想他是怎么把参数对应上去了,原来都在on方法里面处理了,判断参数类型,间接实现了函数重载,感谢
正如楼上提到的一个知识点 arguments这个类数组对象,如果你仔细阅读过一些js的开源源码,你会发现很多开源库中在处理函数参数时候大多数都是通过arguments这个对象来处理的,很少直接使用字面上的参数列表。
知道了这个我想你的问题也就有了答案了,那么对于所谓函数参数的类型其实就没有任何意义了,这个完全你可以根据arguments对象在内部做校验然后根据不同类型处理了,也就是造成了,我们表层看到了类似函数重载的情况了。
js本身是没有重载概念但是确实支持,只是后面的覆盖了前面的function而已
是的,是你说的这样,现在明白了,感谢
我在方法体中switch case,算不算重载呢?js里面大概就是这样一个道理,判断参数个数,判断参数类型,执行不同代码,返回不同值,就达到了重载的效果。
现在明白了,感谢
@木木牛流马: :)