JavaScript高阶函数

举报
薛定喵君 发表于 2021/06/03 23:41:37 2021/06/03
【摘要】 至少满足下列条件之一的函数 可以作为参数被传递可以作为返回值输出 # 应用场景 # 作为参数传递 # 回调函数 ajax 异步请求完成之后执行 var getUserInfo = function( userId, callback ){ $.ajax( 'http://xxx.com/getUserInfo?' + userId, fu...

至少满足下列条件之一的函数

  • 可以作为参数被传递
  • 可以作为返回值输出

# 应用场景

# 作为参数传递

# 回调函数

ajax 异步请求完成之后执行


    
  1. var getUserInfo = function( userId, callback ){
  2. $.ajax( 'http://xxx.com/getUserInfo?' + userId, function( data ){
  3. if ( typeof callback === 'function' ){
  4. callback(data);
  5. }
  6. });
  7. }
  8. getUserInfo( 13157, function( data ){
  9. console.log(data.userName);
  10. });

# Array.prototype.sort


    
  1. //从小到大排列
  2. [ 1, 4, 3 ].sort( function( a, b ){
  3. return a - b;
  4. });
  5. // 输出: [ 1, 3, 4 ]
  6. //从大到小排列
  7. [ 1, 4, 3 ].sort( function( a, b ){
  8. return b - a;
  9. });
  10. // 输出: [ 4, 3, 1 ]

# 作为返回值输出

# 判断数据的类型


    
  1. var Type = {};
  2. for (var i = 0, type; type = ['String', 'Number', 'Boolean', 'Object'][i++];) {
  3. (function(type) {
  4. Type["is" + type] = function(o) {
  5. return Object.prototype.toString.call(o) === '[object ' + type + ']';
  6. }
  7. })(type);
  8. }
  9. console.log(Type.isString("hh"));

# getSingle

单例模式的例子


    
  1. var getSingle = function ( fn ) {
  2. var ret;
  3. return function () {
  4. return ret || ( ret = fn.apply( this, arguments ) );
  5. };
  6. };
  7. //效果
  8. var getScript = getSingle(function(){
  9. `return document.createElement( 'script' );
  10. });
  11. var script1 = getScript();
  12. var script2 = getScript();
  13. alert ( script1 === script2 ); // 输出: true

# 实现AOP

把一些跟核心业务逻辑模块无关的功能抽离出来,这些跟业务逻辑无关的功能通常包括日志统计、安全控制、异常处理等
可以保持业务逻辑模块的纯净和高内聚性

在 JavaScript中实现 AOP,都是指把一个函数“动态植入”到另外一个函数之中,例如扩展 Function.prototype


    
  1. Function.prototype.before = function(beforeFn) {
  2. var self = this;
  3. return function() {
  4. beforeFn.apply(this, Array.prototype.slice.call(arguments));
  5. return self.apply(this, Array.prototype.slice.call(arguments));
  6. }
  7. };
  8. Function.prototype.after = function(afterFn) {
  9. var self = this;
  10. return function() {
  11. var ret;
  12. ret = self.apply(this, Array.prototype.slice.call(arguments));
  13. afterFn.apply(this, Array.prototype.slice.call(arguments));
  14. return ret;
  15. }
  16. }
  17. var func = function() {
  18. console.log(2);
  19. }
  20. func = func.before(function() {
  21. console.log(1);
  22. }).after(function() {
  23. console.log(3);
  24. })
  25. func();//1 2 3

# 柯里化

currying又称部分求值。一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。


    
  1. var curry = (function() {
  2. var data = [1];
  3. var func = function(n) {
  4. data.push(n);
  5. return func;
  6. }
  7. func.valueOf = function() {
  8. var ret = data.reduce(function(a, b) {
  9. return a * b;
  10. })
  11. data = [1];
  12. return ret;
  13. }
  14. return func;
  15. })();
  16. console.log(curry(1));
  17. console.log(curry(1)(2));
  18. console.log(curry(1)(2)(3));

专门定义一个函数,对上面解法的参数进行柯里化⬇️


    
  1. var curry = function(fn) {
  2. var args = [];
  3. var ret = function(n) {
  4. args.push(n);
  5. return ret;
  6. }
  7. ret.valueOf = function() {
  8. var ret = args.reduce(fn);
  9. args = [];
  10. return ret;
  11. }
  12. return ret;
  13. }
  14. var func = curry(function(a, b) {
  15. return a * b;
  16. })
  17. console.log(func(1));
  18. console.log(func(1)(2));
  19. console.log(func(1)(2)(3));

文章来源: blog.csdn.net,作者:薛定喵君,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jsxg2009/article/details/115244194

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。