Функциональное программирование на javascript: звони и применяй

JavaScript функциональное программирование Underscore.js
Функциональное программирование на javascript: звони и применяй

买一送一: Эта серия позволяет освоить函数式编程, и бонусunderscoreНавык


Ежедневный ББ

Перед лицом постоянно меняющихся编程语言начали войны функционального программирования, гибкие древниеjavascriptПочему бы тебе не присоединиться к войне?javascriptНо старичок естественно поддерживает основные функции. Если вы хотите стать высококлассным программистом, вне зависимости от того, занимаетесь ли вы фронтендом, бэкендом или полным стеком, разрабатываете ли выwebилиhybrid, как это не освоить? Автор в основномjavaПрактики, объектно-ориентированное мышление имеет глубокие корни, начнем сjavascriptКак краеугольный камень, сломай и встань, заново учисьjavascript, выполняйте функциональное программирование и получайте невероятное удовольствие от программирования.


сказатьjavascriptиз函数编程 Jqueryможно меньше, ноunderscoreважно, независимо от того, владеете вы им или нетunderscore, и последующие статьи этой серии могут широко использовать эту библиотеку.

Первый урок, который я должен сказать

  • call()а такжеapply()

владелецcall()а такжеapply()Это не ключ к изучению функционального программирования, а краеугольный камень.Давайте сначала кратко поговорим о нем: фактическиcallа такжеapplyЦель существования только одна: изменить общее внутреннееthisуказывает на,thisЭто не клише. Это пустая трата времени каждого. Я слышал, что это хулиганство, чтобы не привести пример. Я не могу этого сказать...

/**
 * Created by Venda-GM on 2017/10/18.
 */

function Peaple() {}
Peaple.prototype = {
    name:'小明',
    say:function(){
        alert(this.name);
    }
}

var Peaple1 = {
    name:'小强'
}

var peaple = new Peaple();
peaple.say.call(Peaple1); //小强
peaple.say.apply(Peaple1);//小强   
//******************知识点0.0***************
Fn1并没有say这个方法,但是fn原型有,那么fn.call...

Видно, что: один из нихthisбыл указан,nameне оригиналPeapleсередина小明охватывать

  • В заключение:

不管是call 还是 apply 都改变了函数的 this 对象

Между этими двумя функциями всегда существует разрыв. Каков конкретный разрыв? --接受参数不一样--

call()方法中的[其余的]参数必须直接传给函数

apply()接收两个参数:一个参数是运行时的作用域,
另一个是参数数组、或arguments等
  • argumentsчто это такое?

а такжеcall, применяются так же, как каждыйfunctionвстроенные методы,argumentsявляется свойством, вы можете получить все переменные, переданные этому методу.一般在库中极为常见Нижняя линия①_.toArrayПросто используйте его.

  • После понимания давайте объединим это, чтобы сделать пример:

мы делаем函数: принимает функцию, возвращает функцию и используетapplyВыполнить возвращенную функцию.

        function splat(fun){ 
            return function(array){
                return fun.apply(console,array);
            }
        }
        var addArray = splat(function(x,y){
            this.log(x,y)
            return x+y;
        })
        addArray([1,2]); //3
        
        ```
        
先自己想1分钟,然后我来解析一下发生了啥?

![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2017/10/19/3147f656dc04af503316778871056470~tplv-t2oaga2asx-image.image)

我们调用`addArray`的时候`addArray`调用了`splat()`函数并向他传递了一个`函数`(我们简称`解决方案`吧),而他也没干啥好事,最终`splat()`返回的函数说:`“我也解决不了,你的方案不错,就用你的做吧。”` 说完大笔一挥, `fun.apply() `[同意!] 并且把你提交的`[1,2]`,按照你的解决方案执行了后还给你。

- 并且发现

最终`addArray`内部的`this`对象由`window`转变为了`console`。有人问这有个吊用?下面举例

    function splat(fun){ 
        return function(array){
            var math_π =[1,4,1,5,9,2,6,5];
            return fun.apply(math_π,array);
        }
    }
    var addArray = splat(function(x,y){
        this.push(x+y)
        console.log(this); //[1,4,1,5,9,2,6,5,3]
        return x+y;
    })
    addArray([1,2]); //3
    
    ```

у нас есть частная собственностьmath_π, не хочу делать его глобальным и выполняюaddArrayАнонимный метод по-прежнему позволяет емуmath_πСделайте что-нибудь, тогда мы сможем передать указательapplyуказать на это, сделать что-то

я сказал раньше面向对象编程Сказав это, частный объектно-ориентированный подход заключается в настройке цепочки прототипов.get/setметод, вnewобъект,getВот именно, объектно-ориентированный понять несложно, но немного ли он ориентированjavaТакой же сложный.


Что только что сказал пример? Амнезия снова наносит удар! Мы сказали, что реализовали функцию, которая принимает функцию и возвращает функцию, возвращаемая функция выполняет принятую функцию и меняет область видимости.

Можем сделать наоборот, если есть такое требование:

У меня есть способ принять массив, но теперь есть анархия, чтобы позволить мне только пройти строку, сколько людей не знают, что мне делать?

//原始方法
var F = function(array){
            return array.join(' ')
        }

данные для отправки

1,2,3,4,5,7,7,zzz,www,ddd

Мы сначала подумалиarguments, то как F может выполнить требования в неизменном виде? использоватьcall! полное совпадение

//做一个转换器
var ParamsConvertor  =  function(fun) {
    return function(){ //返回一个匿名函数
        fun.call(this,_.toArray(arguments));①
    }
}

Мы называем следующее:

ParamsConvertor(F)(1,2,3,4,5,7,7,'zzz','www','ddd');

распечатать результат:

1 2 3 4 5 7 7 zzz www ddd

Идеально!

Это только касается некоторых граней функционального стиля, и уже очень интересно, каково будет начать серьезно программировать?

тут уже поздно писать

пс: ①_.toArrayдаunderscoreфункция ,

toArray_.toArray(list) 
把list(任何可以迭代的对象)转换成一个数组,在转换 arguments 对象时非常有用。

(function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
=> [2, 3, 4]

Мы видели, что он действительно использовалargumentsобъект.


материал:подчеркивание китайской документацииа такжеunderscoreЕго также можно использовать вместе сlodash китайская документацияМастер на данный моментunderscoreВот и все.

кодовый адрес

Блог будет размещен на этом в будущемgitВ библиотеке и напишите список, можете кликнуть, если интересноstar,точкаstarне теряйся,githubЕсть архивы.


Официально ступит дальше函数式编程, вы готовы, кроме того设计模式Я также буду стараться изо всех сил, чтобы продолжать обновлять его.Я изначально планировал обновлять его по одной серии за раз, но я не мог этого вынести и хотел написать другие вещи.На самом деле, я хочу написать java совсем недавно, и я хотите использовать его.Electronпакет одинelasticsearchКлиент, продолжайте поддерживать爬虫框架, Я хочу сделать много вещей, не торопитесь.