From f408aa43143f257fbcf29a79747e5f5f99339f21 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 17 Apr 2011 14:11:40 -0700 Subject: [PATCH] Remove unnecessary usage of Function.prototype.bind (#7783) but maintain API. Also fix bug with proxy failing when a name is provided. Fixes #8893. --- src/core.js | 40 +++++++++------------------------------- src/support.js | 4 ---- test/unit/core.js | 5 ++++- 3 files changed, 13 insertions(+), 36 deletions(-) diff --git a/src/core.js b/src/core.js index 89bbde5c01..a82a2fdced 100644 --- a/src/core.js +++ b/src/core.js @@ -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++; diff --git a/src/support.js b/src/support.js index 1bd35cab2d..867e183675 100644 --- a/src/support.js +++ b/src/support.js @@ -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, diff --git a/test/unit/core.js b/test/unit/core.js index cc744e7b1b..f0bf24cd5a 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -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." );