Rename a given function. Tries to be cross-platform and guaranteed. Useful when you want to preserve name of bound function. In bonus, allows passing context to the renamed function.
npm i rename-function --save
There's a couple of things that you should be aware off and make your attention, few scenarios - you can do few things with package like this - rename function, binding function with context and both together.
- Just rename given
fn
to havename
instead of original name. - Throw
TypeError
if givenfn
not a function. - If only
fn
is given, it is returned without modifications - nothing done. - If
fn
is given and falseyname
(meaning non-string) - just returns thefn
- nothing done. - If
fn
is given andname
is same as original name - just returns thefn
- nothing done. - If
fn
,name
andctx
is given, andname
is as original - returns function withctx
and same name. - If
fn
andctx
is given, then function remains the same - onlyctx
is bound.
Meaning, this package try to follow native behaviours. Because you can't do such thing
function zooparks () { return this }
var boundOne = renameFunction(zooparks, {foo: 'one'})
var boundTwo = renameFunction(boundOne, {foo: 'two'})
var boundZzz = renameFunction(boundTwo, {foo: 'zzz'})
console.log(boundZzz()) // => {foo: 'one'}
and expect boundZzz()
to return {foo: 'zzz'}
, it would be {foo: 'one'}
always. It's still a bit strange even to me, because of use the thing that I call "smart binding" with which I tried to solve this problem and will continue. Kinda strange, when debugging it seems it shows expected results. But in other hand that's the native behaviour, see this one:
function zooparks () { return this }
var boundOne = zooparks.bind({foo: 'one'})
var boundTwo = boundOne.bind({foo: 'two'})
var boundZzz = boundTwo.bind({foo: 'zzz'})
console.log(boundZzz()) // => {foo: 'one'}
For more use-cases see the tests
const renameFunction = require('rename-function')
Rename given
fn
withname
. If givenname
is same as old, then thefn
is just returned earlier, nothing more is done.
Params
fn
{Function}name
{String|Object}ctx
{Object}returns
{Function}: or throwsTypeError
iffn
not a function
Example
var rename = require('rename-function')
var getName = require('get-fn-name')
var fn = rename(fixture () {}, 'abc')
console.log(getName(fn)) // => 'abc'
console.log(fn.name) // => 'abc'
// passing context
var bound = rename(fixture foo () { return this }, 'zoo', {a: 'b'})
console.log(bound()) // => {a: 'b'}
console.log(bound.name) // => 'zoo'
console.log(getName(bound)) // => 'zoo'
- bind-context: Bind context to a function and preserves her name. Can be used… more | homepage
- function-arguments: Get arguments of a function, useful for and used in dependency injectors.… more | homepage
- is-async-function: Is function really asynchronous function? Trying to guess that based on check… more | homepage
- is-bound-function: Check if given function is bound or not. | homepage
- is-callback-function: Returns true if function is a callback. Checks its name is one… more | homepage
- parse-function: Parse a function, arrow function or string to object with name, args,… more | homepage
- smart-bind: Smarter binding of function with some context. It uses .apply instead of… more | homepage
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
But before doing anything, please read the CONTRIBUTING.md guidelines.