File: src/js-ext/lib/function.js
/**
*
* Pollyfils for often used functionality for Functions
*
* <i>Copyright (c) 2014 ITSA - https://github.com/itsa</i>
* New BSD License - http://choosealicense.com/licenses/bsd-3-clause/
*
* @module js-ext
* @submodule lib/function.js
* @class Function
*
*/
"use strict";
require('polyfill/polyfill-base.js');
var NAME = '[Function]: ';
(function(FunctionPrototype) {
/**
* Sets the context of which the function will be execute. in the
* supplied object's context, optionally adding any additional
* supplied parameters to the end of the arguments the function
* is executed with.
*
* @method rbind
* @param [context] {Object} the execution context.
* The value is ignored if the bound function is constructed using the new operator.
* @param [args*] {any} args* 0..n arguments to append to the end of
* arguments collection supplied to the function.
* @return {function} the wrapped function.
*/
FunctionPrototype.rbind = function (context /*, args* */ ) {
console.log(NAME+'rbind');
var thisFunction = this,
arrayArgs,
slice = Array.prototype.slice;
context || (context = this);
if (arguments.length > 1) {
// removing `context` (first item) by slicing it out:
arrayArgs = slice.call(arguments, 1);
}
return (arrayArgs ?
function () {
// over here, `arguments` will be the "new" arguments when the final function is called!
return thisFunction.apply(context, slice.call(arguments, 0).concat(arrayArgs));
} :
function () {
// over here, `arguments` will be the "new" arguments when the final function is called!
return thisFunction.apply(context, arguments);
}
);
};
}(Function.prototype));