Remove unnecessary usage of Function.prototype.bind (#7783) but maintain API. Also fix bug with proxy failing when a name is provided. Fixes #8893.
This commit is contained in:
parent
2786a11053
commit
f408aa4314
34
src/core.js
34
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 ) {
|
||||
var args = slice.call( arguments, 2 ),
|
||||
proxy = function() {
|
||||
return arguments.length ?
|
||||
fn.apply( context, args.concat( slice.call( arguments ) ) ) :
|
||||
fn.apply( context, args );
|
||||
return fn.apply( context, args.concat( slice.call( arguments ) ) );
|
||||
};
|
||||
} else {
|
||||
proxy = function() {
|
||||
return arguments.length ?
|
||||
fn.apply( context, arguments ) :
|
||||
fn.call( context );
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// 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." );
|
||||
|
||||
|
|
Loading…
Reference in a new issue