[关闭]
@GivenCui 2016-06-01T18:00:18.000000Z 字数 2038 阅读 625

高阶函数

js高级


高级函数的概念

参数可以接受另外一个函数或者可以返回一个函数的函数.
例如: 事件的Util封装, Ajax的封装.

JS中的函数特点:
1. 函数可以作为参数
2. 函数可以赋值给变量
3. 函数可以作为返回值

高级函数举例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>高阶函数</title>
  6. <script type = "text/javascript">
  7. // 高阶函数
  8. // 事件的封装
  9. // ......见之前
  10. // Ajax的封装
  11. // ......见之前
  12. </script>
  13. </head>
  14. <body>
  15. </body>
  16. </html>

作用域安全问题

???

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>作用域安全问题</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //作用域安全问题
  10. //猫的构造器
  11. var Cat = function (name, type) {
  12. this.name = name;
  13. this.type = type;
  14. };
  15. // 创建猫的对象
  16. var cat1 = new Cat("端午","波斯猫");
  17. console.log(cat1.name, cat1.type); // ,是链接多个参数
  18. // 这是普通函数调用
  19. var cat2 = Cat("咪咪","加菲猫");
  20. // console.log(cat2.name, cat2.type); // 报错
  21. // 直接调用Cat的话,内部的this指针,会根据当前环境变成window
  22. console.log(name, type); // 咪咪 加菲猫
  23. console.log(window.name, window.type); // 咪咪 加菲猫
  24. console.group("解决上面问题");
  25. var Dog = function (name,type) {
  26. // 判断this指针的构造函数是否是Dog
  27. if(this instanceof Dog) {
  28. this.name = name;
  29. this.type = type;
  30. // 返回当前对象
  31. // new后又new会死循环
  32. return this; // 不返回this会死循环
  33. }
  34. return new Dog(name,type); // 通过这句话解决
  35. };
  36. var dog1 = new Dog("妞妞","边牧");
  37. var dog2 = Dog ("二哈","哈士奇");
  38. console.log(dog1.name, dog1.type);
  39. console.log(dog2.name, dog2.type);
  40. console.groupEnd();
  41. </script>
  42. </body>
  43. </html>

函数柯里化

function currying,函数柯里化
??

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>function currying</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // 函数的柯里化与闭包类似,函数的绑定,有区别
  10. // 全局变量实现叠加功能
  11. // 声明全局变量
  12. var totalCount = 0;
  13. var fn = function (count) {
  14. totalCount += count;
  15. };
  16. // 每次调用
  17. fn(100);
  18. fn(200);
  19. fn(300);
  20. console.log(totalCount);
  21. // 利用柯里化可以实现把每次执行的函数结果存储起来,当你最后一次想得到结果的时候,再停止存储.
  22. // fn2 是后面函数的返回值
  23. var fn2 = (function () {
  24. // 把每次调用内部函数的结果都存在这个数组中
  25. // 因为是闭包,这个数组不会销毁,会立即存在
  26. var args = [];
  27. return function () {
  28. // 没有函数参数传入的时候
  29. if (!arguments.length) { // 弱类型转换 <===> arguments.length==0;
  30. var sum = 0;
  31. // 遍历args取出每个结果,叠加起来,返回.
  32. for(var i=0;i<args.length;i++){
  33. sum+=args[i];
  34. }
  35. return sum;
  36. }
  37. // arguments[0] ,假定只有一个参数的情况
  38. //args.push(arguments[0]); // 否则存到数组中
  39. /*for(var idx in arguments){
  40. args.push(arguments[idx]);
  41. }*/
  42. [].push.apply(args,arguments);
  43. };
  44. })();
  45. // 存值的过程
  46. fn2(1000,1000,1000);
  47. fn2(3000);
  48. fn2(3000);
  49. // 当函数没有传入任何参数的时候,返回最后结果
  50. console.log("把之前结果相加:3*1000+3000+3000="+fn2());
  51. </script>
  52. </body>
  53. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注