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执行顺序详细介绍
Dec 04 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
jQuery中unbind()方法用法实例
Jan 19 Javascript
JS功能代码集锦
May 04 Javascript
JavaScript代码实现图片循环滚动效果
Mar 19 Javascript
微信小程序开发实战教程之手势解锁
Nov 18 Javascript
详谈JavaScript的闭包及应用
Jan 17 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
Feb 22 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
May 23 Javascript
微信小程序radio组件使用详解
Jan 31 Javascript
vue axios请求拦截实例代码
Mar 29 Javascript
vue 使用lodash实现对象数组深拷贝操作
Sep 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 array_multisort() 函数的深入解析
2013/06/20 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
php集成开发环境详解
2019/09/24 PHP
javaScript 页面自动加载事件详解
2014/02/10 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
详解js中let与var声明变量的区别
2020/04/05 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
Python程序员开发中常犯的10个错误
2014/07/07 Python
Tensorflow中的placeholder和feed_dict的使用
2018/07/09 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
毕业生自我推荐
2013/11/04 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
法人代表授权委托书
2014/04/08 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
责任书格式范文
2014/07/28 职场文书
学校党员对照检查材料
2014/08/28 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android