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 解析Json字符串的性能比较分析代码
Dec 16 Javascript
js中创建对象的几种方式示例介绍
Jan 26 Javascript
javascript跨浏览器的属性判断方法
Mar 16 Javascript
JQuery实现防止退格键返回的方法
Feb 12 Javascript
jQuery实现复选框成对选择及对应取消的方法
Mar 03 Javascript
javascript数据结构与算法之检索算法
Apr 04 Javascript
JS中Location使用详解
May 12 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
Feb 08 Javascript
vue bootstrap小例子一枚
Jun 09 Javascript
微信小程序canvas实现刮刮乐效果
Jul 09 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 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中处理模拟rewrite 效果
2006/12/09 PHP
php中stream(流)的用法
2014/03/25 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
详解js类型判断
2018/05/22 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
python多线程扫描端口示例
2014/01/16 Python
python实现井字棋游戏
2020/03/30 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
python中怎么表示空值
2020/06/19 Python
python使用建议与技巧分享(一)
2020/08/17 Python
就业自荐书
2013/12/05 职场文书
4s店机修工岗位职责
2013/12/20 职场文书
文明餐桌活动方案
2014/02/11 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
旷工检讨书大全
2015/08/15 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
Java中try catch处理异常示例
2021/12/06 Java/Android