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 相关文章推荐
Event altKey,ctrlKey,shiftKey属性解析
Dec 18 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
js使用ajax读博客rss示例
May 06 Javascript
chrome不支持form.submit的解决方案
Apr 28 Javascript
JavaScript驾驭网页-DOM
Mar 24 Javascript
JavaScript动态生成二维码图片
Apr 20 Javascript
jQuery多级联动下拉插件chained用法示例
Aug 20 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
Sep 27 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
Feb 20 Javascript
vue路由 遍历生成复数router-link的例子
Oct 30 Javascript
React实现轮播效果
Aug 25 Javascript
vue 如何使用递归组件
Oct 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用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
分享10段PHP常用代码
2015/11/11 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
微信小程序自定义组件
2017/08/16 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
详解Python3中的Sequence type的使用
2015/08/01 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
详解python的ORM中Pony用法
2018/02/09 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
pycham查看程序执行的时间方法
2018/11/29 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
了解一下python内建模块collections
2020/09/07 Python
英国著名书店:Foyles
2018/12/01 全球购物
Vita Fede官网:在意大利手工制作,在纽约市设计
2019/10/25 全球购物
经典优秀个人求职信分享
2013/12/12 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
体育课课后反思
2014/04/24 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
Django操作cookie的实现
2021/05/26 Python
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技