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的document对象和window对象详解
Dec 30 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
Apr 26 Javascript
JSON传递bool类型数据的处理方式介绍
Sep 18 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 Javascript
Vue 中批量下载文件并打包的示例代码
Nov 20 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
Dec 06 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
Oct 09 Javascript
图文详解vue框架安装步骤
Feb 12 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
vue3.0+vue-router+element-plus初实践
Dec 02 Vue.js
老生常谈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
获得Google PR值的PHP代码
2007/01/28 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
php微信开发之谷歌测距
2018/06/14 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
2017/10/14 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
python实现百度关键词排名查询
2014/03/30 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
wxPython实现带颜色的进度条
2019/11/19 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
请用用Java代码写一个堆栈
2012/01/26 面试题
小学教育毕业生自荐信
2013/11/18 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
学校社会实践活动总结
2014/07/03 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python
Rust中的Struct使用示例详解
2022/08/14 Javascript