The secret to wholesale...

In the article about buying Thai goods, I introduced wholesale markets and cheap...

Restaurant business and the...

Customers are a special figure in restaurants. This may seem obvious, but...

Guide the clues to...

Japanese goods Known for putting quality first. However, in the past, due...

Online cosmetics business and...

Starting a business, especially online cosmetics business is the silver trend and...
HomeLập trìnhJavaScriptJavaScript 函数式编程技巧 -...

JavaScript 函数式编程技巧 – 反柯里化


作为函数式编程语言,JS 带来了很多语言上的有趣特性,比如柯里化和反柯里化。

1. 简介

柯里化, , , , , , , , , , , 个 的 的 的 的 拆成 拆成 拆成 拆成 拆成 拆成 单参数(或部分)函数,内部再返回调用下一个单参数(或部分)函数,依次处理剩余的参数。

反柯里化, , , , , , , , , 范围 范围 范围 对象 对象 对象 对象 对象 对象 对象 对象 对象

2. 实现

先来看看反柯里化的通用实现吧~

Function.prototype.unCurrying = function() {
  const self = this
  return function(...rest) {
    return Function.prototype.call.apply(self, rest)
  }
}

解释下:

  1. 为Function原型添加uncurrying方法,并在执行的时候保存执行unCurrying的方法到self
  2. Bạn có nên nộp đơn đăng ký cuộc gọi của mình không?

还有一个实现:

Function.prototype.unCurrying = function() {
  return this.call.bind(this)
}

Bạn có thể sử dụng ứng dụng Funtion.prototype của mình để tìm hiểu về chức năng.prototype:

function unCurrying(fn) {
  return function(tar, ...argu) {
    return fn.apply(tar, argu)
  }
}

3. 使用

3.1 简单使用

unCurrying通用实现简单的实用一下试试:

Function.prototype.unCurrying = function() {
  const self = this                        // 这里的self就是Array.prototype.push方法
  return function(...rest) {              // rest为传入的两层参数[[1,2,3],4]
    return Function.prototype.call.apply(self, rest)
  }
}
const push = Array.prototype.push.unCurrying()

~function(...rest) {       // rest:[1,2,3]
  push(rest, 4)
  console.log(rest)    // [1, 2, 3, 4]
}(1, 2, 3)

3.2 借用其他方法

反柯里化其实反是一种思想,即扩大方法的适用范围,仍然调用刚刚的通用unCurrying方法借用push方法:

const push = Array.prototype.push.unCurrying()

const obj = { a: '嘻嘻' }
push(obj, '呵呵', '哈哈', '嘿嘿')
console.log(obj)                    // { '0': '呵呵', '1': '哈哈', '2': '嘿嘿', a: '嘻嘻', length: 3 }

相当于obj.push(...)Obj 不仅 了 数组 以 数字 索引 , , , 类似于 数 数 数 组 的 属性 , , , 引擎 自动 源码 源码Bạn không cần phải đẩy các ứng dụng của mình ra khỏi máy tính để bàn.

只要是方法,unCurrying就可以借用,call方法也可以:

var call = Function.prototype.call.unCurrying();
function $(id) {
    return this.getElementById(id);
}
call($, document, 'demo')            // #demo 元素

Đọc thêm  Học JavaScript – Khóa học JS miễn phí cho người mới bắt đầu

相当于document.$('demo'),Tôi không muốn gọi điện cho bạn, hãy gọi cho tôi, hãy cho tôi biết tài liệu của bạn và tôi sẽ không gặp vấn đề gì nếu bạn không có tài liệu này.{ getElementById:T=>console.log(T+'呃') } // demo呃

3.3 phần mở rộng

unCurrying本身也是方法,也可以借用自己…-。-

const unCurrying = Function.prototype.unCurrying.unCurrying()
const map = unCurrying(Array.prototype.map)
map({ 0: 4, 1: 'a', 2: null, length: 3 }, n => n + n)                    // [8, "aa", 0]

神奇吧~

4. 总结

简单说,函数柯里化就是对高阶函数的降阶处理,缩小适用范围,创建一个针对性更强的函数:〠〠

function(arg1,arg2)        // => function(arg1)(arg2)
function(arg1,arg2,arg3)        // => function(arg1)(arg2)(arg3)
function(arg1,arg2,arg3,arg4)        // => function(arg1)(arg2)(arg3)(arg4)
function(arg1,arg2,…,argn)        // => function(arg1)(arg2)…(argn)

而反柯里化就是反过来,增加适用范围,让方法使用场景更大。使用unCurrying可以把原生方法借出来,让任何对象拥有原生对象的方法。举个栗子:

obj.func(arg1, arg2)        // => func(obj, arg1, arg2)

也可以这样理解:柯里化 柯里化 柯里化 柯里化 , , , 运算 把 原来 原来 上下文 上下文 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 未来 传递 传递 传递 传递 传递 传递 传递 传递 传递


附:

V8 không cần cài đặt Array.prototype.push

function ArrayPush() {
    var n = TO_UINT32(this.length);
    var m = %_ArgumentsLength();
    for (var i = 0; i < m; i++) {
        this[i + n] = %_Arguments(i);        // 属性拷贝
        this.length = n + m;                    // 修正length
        return this.length;
    }
}



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status