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 相关文章推荐
js计算页面刷新的次数
Jul 20 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
js判断输入是否为数字的具体实例
Aug 03 Javascript
基于豆瓣API+Angular开发的web App
Jan 02 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
js实现点击文本框显示日期选择器特效代码分享
May 21 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
AngularJS ng-repeat数组有重复值的解决方法
Oct 23 Javascript
javascript 秒表计时器实现代码
Mar 09 Javascript
详解vue静态资源打包中的坑与解决方案
Feb 05 Javascript
Vue Element使用icon图标教程详解(第三方)
Feb 07 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
php学习笔记 面向对象的构造与析构方法
2011/06/13 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
Thinkphp框架开发移动端接口(1)
2016/08/18 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
Python实现的HTTP并发测试完整示例
2020/04/23 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
康帕斯酒店预订:Compass Hospitality(支持中文)
2018/08/23 全球购物
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
劳资专员岗位职责
2013/12/27 职场文书
担保书格式及范文
2014/04/01 职场文书
专科应届毕业生求职信
2014/06/04 职场文书