您的位置:首页 > Web前端 > JavaScript

javascript之复习(框架里的方法们)

2015-12-28 21:05 579 查看
继上次整理,一些东西没有整理完。就写在这。可能比较乱比较杂,因为都是整理的一些东西,也没有到做成专题的程度。

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改成参数减参数的长度,就能实现;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: