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 相关文章推荐
JS实现浏览器菜单命令
Sep 05 Javascript
锋利的jQuery 要点归纳(一) jQuery选择器
Mar 21 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
Jun 22 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
jQuery插件datepicker 日期连续选择
Jun 12 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 Javascript
Vue源码学习之初始化模块init.js解析
Nov 02 Javascript
JS中使用new Option()实现时间联动效果
Dec 10 Javascript
Vue表单控件绑定图文详解
Feb 11 Javascript
Vue CL3 配置路径别名详解
May 30 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桌面中心(一) 创建数据库
2007/03/11 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
2010/06/28 Javascript
JS跨域问题详解
2014/11/25 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
vue中监听返回键问题
2019/08/28 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
pyspark操作MongoDB的方法步骤
2019/01/04 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
Python是怎样处理json模块的
2020/07/16 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
PyQt实现计数器的方法示例
2021/01/18 Python
什么是反射?如何实现反射?
2016/07/25 面试题
Java模拟试题
2014/11/10 面试题
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
标准版离职证明书
2014/09/12 职场文书
2014年服务员工作总结
2014/11/18 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
青岛市的收音机研制与生产
2022/04/07 无线电
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS