Skip to content
Permalink
Browse files
Remove unnecessary usage of Function.prototype.bind (#7783) but maint…
…ain API. Also fix bug with proxy failing when a name is provided. Fixes #8893.
  • Loading branch information
jeresig authored and timmywil committed Apr 17, 2011
1 parent 2a71493 commit 15da298
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 36 deletions.
@@ -752,45 +752,23 @@ jQuery.extend({
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function( fn, context ) {
var args, proxy;

// XXX BACKCOMPAT: Support old string method.
if ( typeof context === "string" ) {
fn = fn[ context ];
context = arguments[0];
var tmp = fn[ context ];
context = fn;
fn = tmp;
}

// Quick check to determine if target is callable, in the spec
// this throws a TypeError, but we will just return undefined.
if ( ! jQuery.isFunction( fn ) ) {
if ( !jQuery.isFunction( fn ) ) {
return undefined;
}

if ( jQuery.support.nativeBind ) {
// Native bind
args = slice.call( arguments, 1 );
if ( args.length ) {
proxy = Function.prototype.bind.apply( fn, args );
} else {
proxy = fn.bind( context );
}
} else {
// Simulated bind
args = slice.call( arguments, 2 );
if ( args.length ) {
proxy = function() {
return arguments.length ?
fn.apply( context, args.concat( slice.call( arguments ) ) ) :
fn.apply( context, args );
};
} else {
proxy = function() {
return arguments.length ?
fn.apply( context, arguments ) :
fn.call( context );
};
}
}
// Simulated bind
var args = slice.call( arguments, 2 ),
proxy = function() {
return fn.apply( context, args.concat( slice.call( arguments ) ) );
};

// Set the guid of unique handler to the same of original handler, so it can be removed
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
@@ -77,10 +77,6 @@ jQuery.support = (function() {
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t",

// Test for presence of native Function#bind.
// Not in: >= Chrome 6, >= FireFox 3, Safari 5?, IE 9?, Opera 11?
nativeBind: jQuery.isFunction( Function.prototype.bind ),

// Will be defined later
submitBubbles: true,
changeBubbles: true,
@@ -910,7 +910,7 @@ test("jQuery.isEmptyObject", function(){
});

test("jQuery.proxy", function(){
expect(6);
expect(7);

var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); };
var thisObject = { foo: "bar", method: test };
@@ -921,6 +921,9 @@ test("jQuery.proxy", function(){
// Basic scoping
jQuery.proxy( test, thisObject )();

// Another take on it
jQuery.proxy( thisObject, "method" )();

// Make sure it doesn't freak out
equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." );

0 comments on commit 15da298

Please sign in to comment.