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 相关文章推荐
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
Sep 19 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
Dec 17 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
解决vue-cli中stylus无法使用的问题方法
Jun 19 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
Oct 24 Javascript
微信小程序实现的自定义分享功能示例
Feb 12 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
Apr 11 Javascript
ajax跨域访问遇到的问题及解决方案
May 23 Javascript
基于vue和websocket的多人在线聊天室
Feb 01 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
PHP实现的简单日历类
2014/11/29 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
javascript 数组排序函数
2009/08/20 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python的Flask框架与数据库连接的教程
2015/04/20 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
人民教师的自我评价分享
2014/02/21 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
八年级语文教学反思
2016/03/03 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
Windows安装Anaconda3的方法及使用过程详解
2021/06/11 Python
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS