成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JavaScript專題之偏函數(shù)

beita / 1866人閱讀

摘要:專題系列第十四篇,講解偏函數(shù)以及如何實(shí)現(xiàn)一個(gè)函數(shù)定義維基百科中對(duì)偏函數(shù)的定義為翻譯成中文在計(jì)算機(jī)科學(xué)中,局部應(yīng)用是指固定一個(gè)函數(shù)的一些參數(shù),然后產(chǎn)生另一個(gè)更小元的函數(shù)。

JavaScript 專題系列第十四篇,講解偏函數(shù)以及如何實(shí)現(xiàn)一個(gè) partial 函數(shù)

定義

維基百科中對(duì)偏函數(shù) (Partial application) 的定義為:

In computer science, partial application (or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity.

翻譯成中文:

在計(jì)算機(jī)科學(xué)中,局部應(yīng)用是指固定一個(gè)函數(shù)的一些參數(shù),然后產(chǎn)生另一個(gè)更小元的函數(shù)。

什么是元?元是指函數(shù)參數(shù)的個(gè)數(shù),比如一個(gè)帶有兩個(gè)參數(shù)的函數(shù)被稱為二元函數(shù)。

舉個(gè)簡(jiǎn)單的例子:

function add(a, b) {
    return a + b;
}

// 執(zhí)行 add 函數(shù),一次傳入兩個(gè)參數(shù)即可
add(1, 2) // 3

// 假設(shè)有一個(gè) partial 函數(shù)可以做到局部應(yīng)用
var addOne = partial(add, 1);

addOne(2) // 3

個(gè)人覺得翻譯成“局部應(yīng)用”或許更貼切些,以下全部使用“局部應(yīng)用”。

柯里化與局部應(yīng)用

如果看過上一篇文章《JavaScript專題之柯里化》,實(shí)際上你會(huì)發(fā)現(xiàn)這個(gè)例子和柯里化太像了,所以兩者到底是有什么區(qū)別呢?

其實(shí)也很明顯:

柯里化是將一個(gè)多參數(shù)函數(shù)轉(zhuǎn)換成多個(gè)單參數(shù)函數(shù),也就是將一個(gè) n 元函數(shù)轉(zhuǎn)換成 n 個(gè)一元函數(shù)。

局部應(yīng)用則是固定一個(gè)函數(shù)的一個(gè)或者多個(gè)參數(shù),也就是將一個(gè) n 元函數(shù)轉(zhuǎn)換成一個(gè) n - x 元函數(shù)。

如果說兩者有什么關(guān)系的話,引用 functional-programming-jargon 中的描述就是:

Curried functions are automatically partially applied.

partial

我們今天的目的是模仿 underscore 寫一個(gè) partial 函數(shù),比起 curry 函數(shù),這個(gè)顯然簡(jiǎn)單了很多。

也許你在想我們可以直接使用 bind 吶,舉個(gè)例子:

function add(a, b) {
    return a + b;
}

var addOne = add.bind(null, 1);

addOne(2) // 3

然而使用 bind 我們還是改變了 this 指向,我們要寫一個(gè)不改變 this 指向的方法。

第一版

根據(jù)之前的表述,我們可以嘗試著寫出第一版:

// 第一版
// 似曾相識(shí)的代碼
function partial(fn) {
    var args = [].slice.call(arguments, 1);
    return function() {
        var newArgs = args.concat([].slice.call(arguments));
        return fn.apply(this, newArgs);
    };
};

我們來寫個(gè) demo 驗(yàn)證下 this 的指向:

function add(a, b) {
    return a + b + this.value;
}

// var addOne = add.bind(null, 1);
var addOne = partial(add, 1);

var value = 1;
var obj = {
    value: 2,
    addOne: addOne
}
obj.addOne(2); // ???
// 使用 bind 時(shí),結(jié)果為 4
// 使用 partial 時(shí),結(jié)果為 5
第二版

然而正如 curry 函數(shù)可以使用占位符一樣,我們希望 partial 函數(shù)也可以實(shí)現(xiàn)這個(gè)功能,我們?cè)賮韺懙诙妫?/p>

// 第二版
var _ = {};

function partial(fn) {
    var args = [].slice.call(arguments, 1);
    return function() {
        var position = 0, len = args.length;
        for(var i = 0; i < len; i++) {
            args[i] = args[i] === _ ? arguments[position++] : args[i]
        }
        while(position < arguments.length) args.push(argumetns[position++]);
        return fn.apply(this, args);
    };
};

我們驗(yàn)證一下:

var subtract = function(a, b) { return b - a; };
subFrom20 = partial(subtract, _, 20);
subFrom20(5);
寫在最后

值得注意的是:underscore 和 lodash 都提供了 partial 函數(shù),但只有 lodash 提供了 curry 函數(shù)。

專題系列

JavaScript專題系列目錄地址:https://github.com/mqyqingfeng/Blog。

JavaScript專題系列預(yù)計(jì)寫二十篇左右,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖、節(jié)流、去重、類型判斷、拷貝、最值、扁平、柯里、遞歸、亂序、排序等,特點(diǎn)是研(chao)究(xi) underscore 和 jQuery 的實(shí)現(xiàn)方式。

如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。如果喜歡或者有所啟發(fā),歡迎 star,對(duì)作者也是一種鼓勵(lì)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/91401.html

相關(guān)文章

  • JavaScript專題系列文章

    摘要:專題系列共計(jì)篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...

    Maxiye 評(píng)論0 收藏0
  • JavaScript專題系列20篇正式完結(jié)!

    摘要:寫在前面專題系列是我寫的第二個(gè)系列,第一個(gè)系列是深入系列。專題系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點(diǎn)贊,鼓勵(lì)指正。 寫在前面 JavaScript 專題系列是我寫的第二個(gè)系列,第一個(gè)系列是 JavaScript 深入系列。 JavaScript 專題系列共計(jì) 20 篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖、節(jié)流、去重、類型判斷、拷貝、最值、扁平、柯里...

    sixleaves 評(píng)論0 收藏0
  • 2017-08-16 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選理解的專題之偏函數(shù)譯理解事件驅(qū)動(dòng)機(jī)制游戲開發(fā)前端面試中的常見的算法問題發(fā)布中文前端頁面?zhèn)鲄⑸袏y產(chǎn)品技術(shù)刊讀基礎(chǔ)系列二之實(shí)現(xiàn)大轉(zhuǎn)盤抽獎(jiǎng)掘金指南眾成翻譯編程插入排序眾成翻譯源碼講解函數(shù)技術(shù)風(fēng)暴初體驗(yàn)個(gè)人文 2017-08-16 前端日?qǐng)?bào) 精選 理解 JavaScript 的 async/awaitJavaScript專題之偏函數(shù)[譯]理解 Node.js 事件驅(qū)動(dòng)機(jī)制Pokem...

    graf 評(píng)論0 收藏0
  • underscore 系列之內(nèi)部函數(shù) restArgs

    摘要:與最后,使用我們的寫的函數(shù)重寫下函數(shù)系列系列目錄地址。系列預(yù)計(jì)寫八篇左右,重點(diǎn)介紹中的代碼架構(gòu)鏈?zhǔn)秸{(diào)用內(nèi)部函數(shù)模板引擎等內(nèi)容,旨在幫助大家閱讀源碼,以及寫出自己的。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。 partial 在《 JavaScript 專題之偏函數(shù)》中,我們寫了一個(gè) partial 函數(shù),用來固定函數(shù)的部分參數(shù),實(shí)現(xiàn)代碼如下: // 這是文章中的第一版 fu...

    zzzmh 評(píng)論0 收藏0
  • JavaScript專題之遞歸

    摘要:專題系列第十八篇,講解遞歸和尾遞歸定義程序調(diào)用自身的編程技巧稱為遞歸。然而非尾調(diào)用函數(shù),就會(huì)創(chuàng)建多個(gè)執(zhí)行上下文壓入執(zhí)行上下文棧。所以我們只用把階乘函數(shù)改造成一個(gè)尾遞歸形式,就可以避免創(chuàng)建那么多的執(zhí)行上下文。 JavaScript 專題系列第十八篇,講解遞歸和尾遞歸 定義 程序調(diào)用自身的編程技巧稱為遞歸(recursion)。 階乘 以階乘為例: function factorial(n...

    asoren 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<