最近在看js方面的书籍,对Js的理解不是很深通,就是说比较肤浅吧,应该说函数是javascript的精髓所在,也是最难理解的,闭包,多个函数嵌套把头都转晕了,不知
到谁是谁了。
举个经典的实例,也是大师提起的:
function curry(fn){
var args = Array.prototype.slice.call(arguments, 1);
return function(){
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
}
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = curry(add, 5);
console.log(curriedAdd(3)); //8
能看懂这个例子,功力算还可以了;
简单分析下:
(1)当curry执行的时候,有两个参数add,5
执行到var args=Array.prototyoe.slice.call(arguments,1),args就等于数组[5];
(2)然后curriedAdd函数调用,参数是3
执行到 var innerArgs=Array.prototype.slice.call(arguments),这个执行后 innerArgs =3,
那么 finalArgs就是 [5,3]了
执行到 return fn.apply(null,finalArgs),也就是add.apply(null,[5,3]),
结果就是8了。
再看看下面这个例子呢:
Function.prototype.curry=function(){
var fn=this;
args=Array.prototype.slice.call(arguments);
return function(){
return fn.apply(this,args);
}
}
String.prototype.csv=String.prototype.split.curry(/,\s*/);
var results=('m,j,f').csv();
console.log(results);
简单分析下:
(1)当函数执行到 var results=('m,j,f').csv();
也就是返过头来找csv的定义,String.prototype.split.curry(/,\s*/);
那就进入到curry函数里面了,
var fn=this;这个this 在上下文中指代什么?你知道吗?
是String.prototype.split,为什么?String.prototype.split.curry这个足够说明,this指代当前的对象。
之后执行到 args=Array.prototype.slice.call(arguments),这个arguments就是正则表达式/,\s*/, 也就是说args = /,\s*/;
之后执行到return function (){ reutrn fn.apply(this,args)} 这行, 也就是 split.apply(this,args); 这里的this是指代什么?
下面的例子参考《javascript pattern》的page 82:
function add(x, y) {
var oldx = x, oldy = y;
if (typeof oldy === "undefined") { // partial
return function (newy) {
return oldx + newy;
};
}
// full application
return x + y;
}
console.log(add(100,200));
console.log(add(100)(200));
function add_(x,y){
return x+y;
}
function schonfinkelize(fn) {
var slice = Array.prototype.slice,
stored_args = slice.call(arguments, 1);
return function () {
var new_args = slice.call(arguments),
args = stored_args.concat(new_args);
return fn.apply(null, args);
};
}
console.log(schonfinkelize(add_,3)(4));
函数可以作为参数,还可以作为返回值;函数和方法有什么区别呢,先说到这,以后慢慢聊。