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
40
src/core.js
40
src/core.js
|
@ -752,45 +752,23 @@ jQuery.extend({
|
||||||
// Bind a function to a context, optionally partially applying any
|
// Bind a function to a context, optionally partially applying any
|
||||||
// arguments.
|
// arguments.
|
||||||
proxy: function( fn, context ) {
|
proxy: function( fn, context ) {
|
||||||
var args, proxy;
|
|
||||||
|
|
||||||
// XXX BACKCOMPAT: Support old string method.
|
|
||||||
if ( typeof context === "string" ) {
|
if ( typeof context === "string" ) {
|
||||||
fn = fn[ context ];
|
var tmp = fn[ context ];
|
||||||
context = arguments[0];
|
context = fn;
|
||||||
|
fn = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Quick check to determine if target is callable, in the spec
|
// Quick check to determine if target is callable, in the spec
|
||||||
// this throws a TypeError, but we will just return undefined.
|
// this throws a TypeError, but we will just return undefined.
|
||||||
if ( ! jQuery.isFunction( fn ) ) {
|
if ( !jQuery.isFunction( fn ) ) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( jQuery.support.nativeBind ) {
|
// Simulated bind
|
||||||
// Native bind
|
var args = slice.call( arguments, 2 ),
|
||||||
args = slice.call( arguments, 1 );
|
proxy = function() {
|
||||||
if ( args.length ) {
|
return fn.apply( context, args.concat( slice.call( arguments ) ) );
|
||||||
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 );
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the guid of unique handler to the same of original handler, so it can be removed
|
// 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++;
|
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)
|
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
|
||||||
getSetAttribute: div.className !== "t",
|
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
|
// Will be defined later
|
||||||
submitBubbles: true,
|
submitBubbles: true,
|
||||||
changeBubbles: true,
|
changeBubbles: true,
|
||||||
|
|
|
@ -910,7 +910,7 @@ test("jQuery.isEmptyObject", function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.proxy", function(){
|
test("jQuery.proxy", function(){
|
||||||
expect(6);
|
expect(7);
|
||||||
|
|
||||||
var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); };
|
var test = function(){ equals( this, thisObject, "Make sure that scope is set properly." ); };
|
||||||
var thisObject = { foo: "bar", method: test };
|
var thisObject = { foo: "bar", method: test };
|
||||||
|
@ -921,6 +921,9 @@ test("jQuery.proxy", function(){
|
||||||
// Basic scoping
|
// Basic scoping
|
||||||
jQuery.proxy( test, thisObject )();
|
jQuery.proxy( test, thisObject )();
|
||||||
|
|
||||||
|
// Another take on it
|
||||||
|
jQuery.proxy( thisObject, "method" )();
|
||||||
|
|
||||||
// Make sure it doesn't freak out
|
// Make sure it doesn't freak out
|
||||||
equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." );
|
equals( jQuery.proxy( null, thisObject ), undefined, "Make sure no function was returned." );
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue