JavaScript中apply方法的应用技巧小结


Posted in Javascript onSeptember 29, 2016

前言

最近在看JavaScript设计模式,其中有一些巧妙的函数。所以将部分修改后记录在此,顺便加上自己写出的一些好玩的函数。方便大家和自己以后使用。下面来一起看看。

一、apply实现call

Function.prototype.call = function () {
 var ctx = [].shift.apply(arguments)
 return this.apply(ctx, arguments)
}

二、apply实现bind

Function.prototype.bind = function () {
 var ctx = [].shift.apply(arguments),
  args = [].slice.apply(arguments),
  self = this
 return function () {
  return self.apply(ctx, args.concat([].slice.apply(arguments)))
 }
}

三、实现函数柯里化

Function.prototype.currying = function () {
 var args = [],
  self = this
 return function () {
  if (arguments.length === 0) {
   return self.apply(this, args)
  } else {
   [].push.apply(args, arguments)
   return arguments.callee
  }
 }
}
//用法
var add = function () {
 var sum = 0
 for (var i = 0; i < arguments.length; i++) {
  sum += arguments[i]
 }
 return sum
}.currying()
add(2) //并未求值
add(3, 3) //并未求值
add(4) //并未求值
console.log(add()) //12

严格模式不能使用arguments.callee, 稍微改一下

Function.prototype.currying = function () {
 var args = [],
  self = this
 var f = function () {
  if (arguments.length === 0) {
   return self.apply(this, args)
  } else {
   [].push.apply(args, arguments)
   return f
  }
 }
 return f
}

四、实现函数反柯里化

Function.prototype.uncurrying = function () {
 var self = this
 return function () {
  var obj = [].shift.apply(arguments)
  return self.apply(obj, arguments)
 }
}
// 用法
var push = Array.prototype.push.uncurrying()
var obj = {}
push(obj, '嘿')
console.log(obj) //{0: "嘿", length: 1}

另一种方法:callapply连用实现函数反柯里化

Function.prototype.uncurrying = function () {
 var self = this
 return function () {
  return Function.prototype.call.apply(self, arguments)
  //有点绕,其实就是return self.call(args[0], args[1], args[2]...)
 }
}

五、为数组添加max函数

Array.prototype.max = function () {
 return Math.max.apply(null, this)
}
console.log([1, 3, 5, 2].max()) //5

总结

以上就是这篇文章的全部内容改了,希望能对大家的学习和工作有所帮组,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
Google 静态地图API实现代码
Nov 19 Javascript
JS 退出系统并跳转到登录界面的实现代码
Jun 29 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
Dec 23 Javascript
jquery实现pager控件示例
Apr 09 Javascript
Node.js 的异步 IO 性能探讨
Oct 08 Javascript
js遍历map javaScript遍历map的简单实现
Aug 26 Javascript
D3.js实现饼状图的方法详解
Sep 21 Javascript
实例教学如何写vue插件
Nov 30 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
老生常谈javascript变量的命名规范和注释
Sep 29 #Javascript
浅谈javascript:两种注释,声明变量,定义函数
Sep 29 #Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
Sep 29 #Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
Sep 29 #Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 #Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 #Javascript
jQuery 特性操作详解及实例代码
Sep 29 #Javascript
You might like
PHP对象Object的概念 介绍
2012/06/14 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
python实现换位加密算法的示例
2018/10/14 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
2019/06/14 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
2014年审计人员工作总结
2014/12/19 职场文书
给老婆道歉的话
2015/01/20 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书
浅谈python中的多态
2021/06/15 Python
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android