javascript之复习(框架里的方法们)
继上次整理,一些东西没有整理完。就写在这。可能比较乱比较杂,因为都是整理的一些东西,也没有到做成专题的程度。
1.String.repeat()
大家要实现重复一个字符串的重复怎么写呢,反正我的第一想法就是:
function repeat(str,n){
var sum='';
for (var i = 0; i <n; i++) {
sum+=str;
};
return sum;
}
console.log(repeat('ab',3));
其实优化就是把多于的变量消除,多了一个sum变量,总是不太好的,然而人家想的总是比较好的,内置的方法,没有中间变量:
function repeat(target,n){
return (new Array(n+1)).join(target);
}
function repeat(target,n){
return [].join.call({length:n+1},target)
}
这是某框架里的,像这样的函数其实蛮多的,作者这代码的质量一看就…
中间休息分享兼容问题:
unshift ie6.7下不返回长度
splice一个参数的情况下,ie6、7、8默认为0,其他浏览器默认为数组length
2.bind()
bind经常用在本地上下文下调用非本地上下文的函数,跟apply,call差不多,其实源码就是封装了apply:
Function.prototype.bind = function(context) {
if (arguments.length<2&&context==void 0) { //context为空返回this
return this;
}
var __method=this,args=[].slice.call(arguments,1);//取到context后面的参数
return function(){ //执行此方法,传入context环境
return __method.apply(context,args.concat.apply(args,arguments));
}
}
3.柯里化函数curry
function curry(fn){
function inner(len,arg){
if (len==0) {
return fn.apply(null,arg)
};
return function(x){
return inner(len-1,arg.concat(x));
}
}
return inner(fn.length,[])
}
一个函数返回另一个函数,第一个参数是参数的长度,没返回一次length-1,剩下的参数原封不动的扔给返回的函数,再加上新给的参数;
原本的一个
function sum(x,y,z,w){
return x+y+z+w;
}
//柯里化调用
curry(sum)('a')('b')('c')('d');
sum函数,柯里化之后就可以改变参数的传递方式,thunk也是差不多。
如果用户想传入多个参数怎么办?那我们改进一下curry:
function curry2(fn){
function inner(len,arg){
if (len<=0) {
return fn.apply(null,arg)
};
return function(){
return inner(len-arguments.length,arg.concat(Array.apply([],arguments)))
}
}
return inner(fn.length,[])
}
curry2(sum)()('b','c')('d')//'bcd'
把length依次-1改成参数减参数的长度,就能实现;
javascript之复习(框架里的方法们)的更多相关文章
- unittest框架里的常用断言方法:用于检查数据
1.unittest框架里的常用断言方法:用于检查数据. (1)assertEqual(x,y) 检查两个参数类型相同并且值相等.(2)assertTrue(x) 检查唯一的参数值等于True(3)a ...
- javaScript DOM编程经常使用的方法与属性
DOM是Document Object Model文档对象模型的缩写.依据W3C DOM规范,DOM是一种与浏览器,平台,语言无关的接口,使得你能够訪问页面其它的标准组件. Node接口的特性和方法 ...
- iframe里访问父级里的方法属性
window.parent.attributeName; // 访问属性attributeName是在父级窗口的属性名 window.parent.Func(); // 访问属性Func()是在父 ...
- [BUGCASE]CI框架的post方法对url做了防xss攻击的处理引发的文件编码错误
一.问题描述 出现问题的链接: http://adm.apply.wechat.com/admin/index.php/order/detail?country=others&st=1& ...
- JavaScript客户端MVC 框架综述
简介 15 年前,许多人都使用 Perl 和 ColdFusion 之类的工具构建网站.我们经常编写可以在页面顶部查询数据库的脚本,对数据应用必要的转换,以及在同一个脚本底部显示数据.这类架构适合于向 ...
- Atitit.js javascript的rpc框架选型
Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...
- "Timeout"在测试框架里是如何被实现的
今天组里的小伙伴问了我一个问题:“我这里有一个底层驱动的接口,我想在测试它的时候加上超时限制,时间一过就fail掉它,执行后面的测试用例.怎么办到呢?”.我问:“它自己没有超时响应的机制么? 超时抛e ...
- javascript获取iframe框架中页面document对象,获取子页面里面的内容,iframe获取父页面的元素,
javascript获取iframe框架中,加载的页面document对象 因为浏览器安全限制,对跨域访问的页面,其document对象无法读取.设置属性 function getDocument(i ...
- JavaScript 节点操作Dom属性和方法(转)
JavaScript 节点操作Dom属性和方法 一些常用的dom属性和方法,列出来作为手册用. 属性: 1.Attributes 存储节点的属性列表(只读) 2.childNodes 存储 ...
随机推荐
- 【翻译】asp.net core2.1认证和授权解密
asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...
- [转帖]BRD、MRD 和 PRD
来源: https://www.zhihu.com/question/19655491 BRD 商业需求文档 Business Requirement Document MRD 市场需求文档 Mark ...
- Oracle行列转换case when then方法案例
select (select name from t_area where id=areaid) 区域, end) 一月, end) 二月, end) 三月, end) 四月, end) 五月, en ...
- Sublime Text3 配置 NodeJs 开发环境
题外话:使用visual studio开发NodeJs也是很方便,只需要安装插件即可. 本着对Sublime Text3的喜爱,尤其是最近更新后,界面和功能上感觉更nice了,那就配置一发环境吧! ( ...
- MySQL的备份和回复
一.备份的原因 二.备份的类型 三.备份的方式 四.备份策略 五.备份工具
- Hbase数据表解析
demo为表的命名空间,user为表的名字you2个列族,一个为b.一个为o. NAME 为列族名,Replication_SCOPE实现一个远程集群的复制.compression数据压缩的类型 Hb ...
- InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
问题:打开mysql错误日志时发现大量的如下错误 Error: Table "mysql"."innodb_table_stats" not found. In ...
- Java中Optional类的使用
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
- RuntimeError: cryptography requires setuptools 18.5 or newer, please upgrade to a newer version of setuptool
setuptool 太老了,更新下: pip install --upgrade setuptools
- SpringBoot之修改单个文件后立刻生效
问题: 在使用SpringBoot进行开发时,如果修改了某个文件比如前端页面html,不能立刻起效. 解决: 在idea中打开修改后的文件,使用快捷键Ctrl+Shift+F9 进行重新编译,然后刷新 ...