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 存储 ... 
随机推荐
- Latex常用软件
			Linux texMaker sudo apt-get install texlive-full sudo apt-get install texmaker 
- jq简单仿上传文件
			html: <div> <input id="lefile" type="file" style="display:none&quo ... 
- 图解Python的直接赋值与浅拷贝和深度拷贝三者区别
			直接赋值:其实就是对象的引用(别名). 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象. 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象 ... 
- java学习之—合并两个数组并排序
			/** * 合并两个数组并排序 * Create by Administrator * 2018/6/26 0026 * 下午 4:29 **/ public class MergeApp { pub ... 
- select、poll、epoll之间的区别(搜狗面试)
			(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ... 
- 【转】MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)
			1. MySQL 莫名变成了 Strict SQL Mode 最近测试组那边反应数据库部分写入失败,app层提示是插入成功,但表里面里面没有产生数据,而两个写入操作的另外一个表有数据.因为 inser ... 
- scrapy暂停和重启,及url去重原理,telenet简单使用
			一.scrapy暂停与重启 1.要暂停,就要保留一些中间信息,以便重启读取中间信息并从当前位置继续爬取,则需要一个目录存放中间信息: scrapy crawl spider_name -s JOBDI ... 
- 原 线程池中shutdown()和shutdownNow()方法的区别
			参考:shutdown和shutdownNow的区别 shutDown() 当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态.此时,则不能再往线程池中添加任何任务,否则将会抛出Reje ... 
- Delphi之TStrings和TStringLists类
			Delphi之TStrings和TStringLists类 有些类不是组件,但它们支持存在的组件.这些类是其他组件的典型属性,直接由TPersistent派生,如TStrings.TCanvas和TC ... 
- 微信小程序支付功能
			API:wx.requestPayment() { } https://blog.csdn.net/qishubiao/article/details/80804052 
