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 相关文章推荐
jquery png 透明解决方案(推荐)
Aug 21 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
Nov 20 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
May 25 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
Node.js DES加密的简单实现
Jul 07 Javascript
JS实现简单的二元方程计算器功能示例
Jan 03 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
Sep 22 Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 Javascript
微信小程序手动添加收货地址省市区联动
May 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
为原生js Array增加each方法
2012/04/07 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python字符遍历的艺术
2008/09/06 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
python利用dir函数查看类中所有成员函数示例代码
2017/09/08 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
Python 元组操作总结
2019/09/18 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
东方电视购物:东方CJ
2016/10/12 全球购物
美国二手复古奢侈品包包购物网站:LXRandCo
2019/06/18 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
教师实习自我鉴定
2013/12/13 职场文书
社团文化节邀请函
2014/01/10 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
初中优秀学生评语
2014/12/29 职场文书
小学体育教学随笔
2015/08/14 职场文书
MySQL中varchar和char类型的区别
2021/11/17 MySQL
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript