美文网首页JavaScriptweb前端之路%……%
前端基础进阶(七):函数与函数式编程

前端基础进阶(七):函数与函数式编程

作者: 这波能反杀 | 来源:发表于2017-02-23 00:07 被阅读11707次

    由于某些原因,文章已经删除,打算迁移到别处,目前正在寻找更合适的平台。

    请大家关注我的新公众号ar_indus,随后我会在公众号里推送新的博客地址。

    后续计划的《react进阶系列》文章也会在新公众号中推送。

    公众号二维码

    ar_indus

    相关文章

      网友评论

      • 李大胆Joson:你的微信公众号:一周上王者是什么梗
      • moonoa:代码 “{ return += arr[i] }”应该是 “{ result += arr[i] }”
      • moonoa:代码有缺失:
        var a = 20; function fn(a) { a = a + 10; return a; }
        // 此处少了 fn(a)
        console.log(a); // 20
      • moonoa:“ 虽然该匿名函数没有显示的进行赋值操作” 是不是打错了? 显示 -> 显式?
      • 82a56be6a0af:if(typeof o[item] == 'undefined'),请问一下这个set方法里的if判断是不是应该用options来做判断条件,给个解释吧大神
      • c5c463e0f646:在构造函数中添加方法
        function Person(name) {
        this.name = name;
        this.age = age;
        // 在构造函数内部中添加方法
        this.getAge = function() {
        return this.age;
        }
        this.
        }
        // 给原型添加方法
        Person.prototype.getName = function() {
        return this.name;
        }

        // 在对象中添加方法
        var a = {
        m: 20,
        getM: function() {
        return this.m;
        }
        }

        @这波能反杀 这段代码中的this是不是掉了什么?
      • 38babe18ca20:1. 代码优化是不是这样:
        function getUser(path,callback){
        return $.get(path,callback);
        }
        2. 有一点不明白,表达式和语句的区别到底是什么呢?现在还分不清什么是表达式,什么是语句:joy:
      • 奈何138:set({ a: [1, {c: {d: 1}}] });

        打印出 { a: [ 1, { c: [Object] } ] }
      • f1482cbfb158:找个茬:smile:
        获取最后一个应该是,数组索引是从0开始的
        function getLast(arr) {
        return arr[arr.length -1];
        }
      • 8821306415ea:这个type方法学到了,牛掰:flushed:
      • Jason_Zeng:不行了,逻辑性差,讲函数式编程,最后还是没讲清楚…反而扯了一堆其他的,别说那些是基础,而是不应该在这里讲,像什么声明提前,真的有必要这里讲么…
      • 27bda0c4e05d:var person = {
        name: 'Nicholas',
        age: 20
        }
        obj = person
        obj.name = 'abc'
        console.log(person)
        obj = {}
        obj.name = 'hahaha'
        console.log(person,obj)
        我觉得博主的例子没法解释清楚,就算不是函数传值,obj重新赋值就和person没有关系了
      • a71d9974a447:目前你的文章我看到第七章。前五章讲的很棒很棒,我自己也受益匪浅。不过在读到第六章和这一章的值传递方式时,我觉得我读着不是那么顺畅啦。第六章闭包中你自己也没有解释清楚最后那个例子,但是从你其他章节中看得出来你对js编译执行过程是很清楚的。我自己能给出的唯一解释就是闭包在函数解析的过程中,已经形成。它既不是函数A也不是函数B,而是函数B和其访问的上级变量共同形成的一个环境。只不过浏览器在执行到函数调用的时候才会将其展现出来。(js执行每一段代码之前,都有一个“预编译”,预编译干的活是:声明所有var变量(初始为undefined),解析定义式函数语句。重点是解析定义式函数语句。所以我才认定他在解析过程中闭包已经形成,这也是能对第六章最后一个例子的完美解释。)。至于这一章中的传值方式,不管基础类型还是引用类型js传递的都是实参的副本,所以在基础类型中感觉就是按值传递,至于引用类型,它传递的是引用地址的副本。而这个副本和本来的引用地址指向同一个堆地址。而这种传递方式称为共享传递。有没有觉得这种解释下来顺畅多啦。哈哈。我是真心觉得作者真的很棒,但是第六章中和第七章中我觉得作者有点强行的往概念上引,而没有尊重事实。但是我的总结跟你的文章对我的影响密不可分。我希望以后可以看到你更多精彩的文章。
        dc0cf3f0be58:我也觉得叫“共享传递”似乎更好一些,因为如果按照文中的例子,
        var person = {
        name: 'Nicholas',
        age: 20
        }
        那么,我定义另一个变量
        var p2 = person;
        p2 = {};
        p2.name = "张三";
        console.log(person.name) //输出Nicholas;
        如果按照本文的说法,这似乎与第一篇文章中讲的引用类型的变量复制的时候的说法相矛盾(或者我的理解有误)。不过,不可否认的是,波老师对js的理解,确实很深,作者的文章也很受教,希望作者能写出更多的好文章!@这波能反杀
      • 聚宝大当家:function set(options, target) {
        var keys = Object.keys(options);
        var o = target ? target : states;

        keys.map(function(item) {
        if(typeof o[item] == 'undefined') {
        o[item] = options[item];
        }
        else {
        type(o[item]) == 'object' ? set(options[item], o[item]) : o[item] = options[item];
        }
        return item;
        })
        }

        上面这个 我感觉好像有的地方完全没必要啊,你既然最后都是往里追加或者覆盖,那为什么不直接就向下面这样呢?何必绕那么大一圈呢?请大神指教
        function set(option,target){
        var key = Object.keys(option);
        var o = state;
        key.map(function (item) {
        o[item] = option[item]
        })
        }
        595a671018ae: @聚宝大当家 怎么可能一样………你这么写岂不是每次都直接修改states对象?!这就是对象深复制的应用,你可以查查对象深复制。
        聚宝大当家:@这波能反杀 可是效果都是一样的 对吧?
        这波能反杀:@聚宝大当家 深复制
      • 一个庸俗的神:得到数组的最后一项第一个是不是笔误了,arr[arr.length-1]
      • da812b9613d3:干货满满,跟着波同学学习收获很大,大大的赞,大大的祝福
      • 45a8ab8b2055:按值传递的最后一个person的例子我还是不懂; 实际上结论仍然是按值传递,只不过当我们期望传递一个引用类型时,真正传递的,只是这个引用类型保存在变量对象中的引用而已??? 不知道有没有大神帮忙回答下? 谢谢
      • 653e97c1f3b2:关于闭包中状态管理器的那个例子有两点疑问:
        1.既然已经定义了type 方法来判断类型,为什么set()中的类型判读还要用`typeof`。
        2. 在set中的typeof类型判读不用 `===` 是因为有涉及到特殊的隐式类型转换吗?
      • D1等动物:var a = 20;

        function fn(a) {
        a = a + 10;
        return a;
        }

        console.log(a); // 20
        波老师,这里有个问题,fn没有调用
      • nineSean:语句不需要返回值,但可能会有返回值。(大爱楼主前端系列,造福前端小白,继续学习下一章)
      • 9db7abdffd2f:var person = {
        name: 'Nicholas',
        age: 20
        }

        function setName(obj) { // 传入一个引用
        obj = {}; // 将传入的引用指向另外的值
        obj.name = 'Greg';
        }

        setName(person);
        console.log(person.name); // Nicholas 未被改变
        这个例子说明的什么呢?若是不把obj置空,打印出来是Greg的
        诗和元芳:他举得例子不太好,把里面函数换成
        (obj){
        obj = 2;
        console.log(obj)
        },反向推理,假如obj是引用类型,那么我让obj = 2的话,外面也应该变成2,但是事实上,外面还是那个obj,所以传的就是值。
        Lingli_yu:@波同学,同问
        d72edba97470:我也是这里觉得疑惑 因为把他赋值为空对象了 相当于
        function setName() {
        var obj = person;
        obj = {}; // 将传入的引用指向另外的值
        obj.name = 'Greg';
        }

        并不能证明传的就是值
      • 爪哇豆:set({
        o: {
        m: {l:{b:0}},
        n: 20
        }
        })

        // 修改对象o 的m值
        set({
        o: {
        m: {l:33},
        n:6
        }
        })
        为什么这样无法修改o.m的值
        爪哇豆:@王世一_3b95 好的 我试试
        d79438d5ac63:是codepen的问题,嵌套太多了,就只显示Object{}了,其实已经修改了,你可以在node或者浏览器开发者模式下输入试试
        奈何138:同问
      • 浩风起兮:怎么把评论全删了我,那个匿名函数上边的demo不完整,有问题。。。
      • 流曲无觞:上面例子说 window.getAge = getAge;时形成了闭包,但第六章节最后你又讲闭包是在内层函数运行时才确认创建,且内层函数必须访问了上层作用域链中的变量对象,这感觉有点矛盾
        这波能反杀:@流曲无觞 我这里的意思是getAge调用时
      • d01d8d7404c0:最后一个例子为何if(typeof Array.prototype.add !== 'function') {}去掉就'add' undefind?
      • 旭霸:匿名函数标题上面的代码块多了一行不完整代码:smiley:
      • ClassName:系列越往后越精彩,可是点赞数却越来越少,看的我好急啊!! 祝作者早日签约!
      • 种草林:受益匪浅,希望波哥继续加油,看好你哟!
      • lastnigtic:支持支持持
      • 拿着号码牌徘徊:var a = 20;

        function fn(a) {
        a = a + 10;
        return a;
        }

        console.log(a); // 20
        这个例子里 在console前,少了fn(a)把,这样才能等同比较吧,两个例子
      • 别过经年:今天一口气看了六篇文章,收货颇丰,波波辛苦了,期待更多精品出现。
        这波能反杀:能学到东西就好
      • 128f587d6ed6:继续拜读中:stuck_out_tongue_winking_eye:
      • 1784d24ba45a:牛牛牛 一些东西 知道还是知道 但是你能很好地总结和写出来
      • 发不动车的老司机:感觉最后函数式编程讲得不是很清楚,比如为什么要只用表达式,这样做有什么好处;没有副作用理解起来也比较抽象,希望能举个例子说下
        Neuro_annie:@王涛_64d7 return += arr[i] 写错单词了 return 改为 result 就好了
        2aa405c6cb40:function mergeArr(arr) {
        var result = 0;
        for(var i = 0; i < arr.length; i++) { return += arr[i] }
        return result;
        }

        这个例子是不是写错了, return += arr[i] ,这里会报错额
        2752de3707b4:在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数.更复杂的操作幂等保证是利用唯一交易号(流水号)实现. 应该就是幂等性?
      • 97900e44363d:波哥 公众号叫啥?
        这波能反杀:@Mark灬Tang isreact
      • YC____:写的都很好,希望那个可以看到关于原型和继承的啊
      • 4dd84fb715c1:学习js总是会有焦虑情绪反复☹
      • 坤少卡卡:我可能要看个几十遍才能理解透彻,:sob:
      • e798341a1339:感觉没前前几篇含金量高喽
        这波能反杀:- -!是因为光贴了代码吗
      • 239f01adc9eb:第一次登录上来评价一下波老师
        哈哈哈 你的文章我都是午休或者下班的时候很喜欢看
        顺便下面推荐文章 无戒的21天坚持.. 看成了 戒色的21天坚持:sunglasses:
        这波能反杀::pray: 谢谢支持,:joy:
      • 年轻小子:var person = {
        name: 'Nicholas',
        age: 20
        }

        function setName(obj) { // 传入一个引用
        obj = {}; // 将传入的引用指向另外的值
        obj.name = 'Greg'; // 修改引用的name属性
        }

        setName(person);
        console.log(person.name); // Nicholas 未被改变


        这个最后person.name是Nicholas不是‘Grey’,是因为函数中 “obj = {}” 那么这个是复制引用还是创建一个新的值
        年轻小子:我懂了,“obj = {}” 是指向一个新的值,就是obj指向 “堆” 中的值是{};它和传入的那个obj已经指向不同的值了,是吗?
        这波能反杀:@年轻小子 按引用传递,指的是传递进来的值就是一个引用类型。所以改变的时候就有点类似于这样`{ name: 1 } = {}`,但是这样的操作其实是会报错的。`obj = {}`是创建了一个新的对方,并将传进来的引用指向了新对象
      • e82342bd5ce3:波哥,发表柯里化的时候麻烦在微信前端三人行中通知下。
        这波能反杀:@skyroom 嗯,没问题
      • e82342bd5ce3:波哥,你给出的状态管理器的demo在线地址,这玩意注册是要钱的啊?
        这波能反杀:应该不会吧,我一直在用,没给过钱啊
      • 年轻小子:好厉害啊 ,先评论再看 辛苦了
      • 4e0c9b031c35:可不可以讲讲函数,函数表达式,匿名函数,在原型上绑的函数这些优先级问题
        这波能反杀:都是通过执行上下文与变量对象的一些规则来判断的,前面有文章提到过的
      • 杜玲子:好厉害的样子,因为我完全一丁点儿也看不懂!
        这波能反杀:@杜玲子 高考理综120+飘过:sob:
        杜玲子:还是不要了,感觉就跟高中看到数学和物理的感觉差不多的,无从下手。
        这波能反杀::joy: 要不来来学一学,说不定就懂了呢,嘿嘿
      • 014d5acab287:终于更新啦 mark
      • 不是伯格是波哥:我预计第二个阮一峰要诞生
        2752de3707b4:@波同学 哈哈 珍重同意楼上的看法.虽然好像有好多大牛吐槽过阮老师,但是阮老师的文章,浅显易懂,布道应该是数一数二的. 看博主教程的时候,也在想~ 这是要赶超阮老师的节奏 哈哈
        592b64f32a45:要不要那么夸张,不过波同学确实很棒,按这个节奏下去可以成为以后前端新人的人生导师啊:relaxed:
        这波能反杀:@不是伯格是波哥 ~ ~谢谢,反正我会每一篇都认真写
      • 不是伯格是波哥:沙发
        这波能反杀:@不是伯格是波哥 厉害了,我刚发出来

      本文标题:前端基础进阶(七):函数与函数式编程

      本文链接:https://www.haomeiwen.com/subject/iwkcwttx.html