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模仿msgbox提示效果代码
Jun 10 Javascript
详细讲解JS节点知识
Jan 31 Javascript
js 设置缓存及获取设置的缓存
May 08 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
javascript中in运算符用法分析
Apr 28 Javascript
JavaScript中join()方法的使用简介
Jun 09 Javascript
深入理解JavaScript中Ajax
Aug 02 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
vue2.0中goods选购栏滚动算法的实现代码
May 17 Javascript
AngularJS中ng-class用法实例分析
Jul 06 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 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的FTP学习(一)
2006/10/09 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
如何获取Python简单for循环索引
2019/11/21 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
python 录制系统声音的示例
2020/12/21 Python
python re.match()用法相关示例
2021/01/27 Python
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
工程班组长岗位职责
2013/12/30 职场文书
党校培训思想汇报
2014/01/03 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
书香家庭事迹材料
2014/05/09 职场文书
民事授权委托书范文
2014/08/02 职场文书
法制教育演讲稿
2014/09/10 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
关于童年的读书笔记
2015/06/26 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书