uncurry-x

Standard uncurryThis utility for method-to-function transformation with full legacy environment support.

MIT 2 个版本
安装
npm install uncurry-x
yarn add uncurry-x
pnpm add uncurry-x
bun add uncurry-x
README

uncurry-x

Creates an uncurried version of a function that takes this as the first argument.

Installation

npm install uncurry-x

Usage

var uncurryThis = require("uncurry-x")

function greet(name) {
  return this.greeting + ", " + name + "!"
}

var greetUnbound = uncurryThis(greet)

var context = { greeting: "Hello" }
greetUnbound(context, "World") // "Hello, World!"

// Works even after Function.prototype methods are deleted
delete Function.prototype.call
delete Function.prototype.bind

greetUnbound(context, "World") // still works!

API

uncurryThis(fn)

Takes a function and returns an uncurried version where this becomes the first parameter.

Parameters:

  • fn (Function): The function to uncurry

Returns:

  • (Function): The uncurried function with length set to originalLength + 1

.apply helper

The returned function has an .apply method that works like Function.prototype.apply:

var slice = uncurryThis(Array.prototype.slice)

// Using .apply
slice.apply(null, [[10, 20, 30, 40], 1, 3]) // [20, 30]

// Equivalent to:
slice([10, 20, 30, 40], 1, 3) // [20, 30]

Examples

Array methods

var map = uncurryThis(Array.prototype.map)
var join = uncurryThis(Array.prototype.join)

var numbers = [1, 2, 3]
var doubled = map(numbers, function (x) {
  return x * 2
}) // [2, 4, 6]
join(doubled, "-") // "2-4-6"

String methods

var split = uncurryThis(String.prototype.split)
var toLowerCase = uncurryThis(String.prototype.toLowerCase)

split("foo-bar-baz", "-") // ["foo", "bar", "baz"]
toLowerCase("HELLO") // "hello"

Custom methods

function Counter(start) {
  this.count = start
}

Counter.prototype.increment = function (amount) {
  this.count += amount
  return this.count
}

var increment = uncurryThis(Counter.prototype.increment)
var counter = new Counter(10)

increment(counter, 5) // 15

Features

  • ES3 compatible
  • Preserves function length property correctly
  • Works even after Function.prototype.call and Function.prototype.bind are deleted
  • Includes .apply helper method
  • Uses cached references to native methods for maximum reliability

License

MIT

版本列表
1.0.1 2025-12-23
1.0.0 2025-12-23