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 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
基于JS实现密码框(password)中显示文字提示功能代码
May 27 Javascript
javascript如何创建对象
Aug 29 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
JavaScript中undefined和null的区别
May 03 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 Javascript
深究AngularJS之ui-router详解
Jun 13 Javascript
详解基于vue的移动web app页面缓存解决方案
Aug 03 Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 jQuery
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
Aug 23 jQuery
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
JavaScript实现酷炫的鼠标拖尾特效
Feb 18 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/10/09 PHP
PHP 工厂模式使用方法
2010/05/18 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
轮播图组件js代码
2016/08/08 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
Python使用剪切板的方法
2017/06/06 Python
Django权限机制实现代码详解
2018/02/05 Python
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
2014年会策划方案
2014/05/11 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
环卫处个人工作总结
2015/03/04 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
单位病假条范文
2015/08/17 职场文书