javascript call/apply

* 实现函数 callIt,调用之后满足如下条件
1、返回的结果为调用 fn 之后的结果
2、fn 的调用参数为 callIt 的第一个参数之后的全部参数

function callIt(fn) {
    return fn.apply(this, [].slice.call(arguments, 1));
}

// test
var fn = function(a, b, c) {
	return a+b+c;
}

callIt(fn, 1, 2, 3);   // 6

  

* 实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数

function partialUsingArguments(fn) {
    var args = [].slice.call(arguments, 1);
    return function() {
    	// [].slice.call(arguments) => 把arguments伪数组转换为数组
    	return fn.apply(this, args.concat([].slice.call(arguments)))
    }
}

  

* 函数curry

已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
4、调用 c 之后,返回的结果与调用 fn 的返回值一致
5、fn 的参数依次为函数 a, b, c 的调用参数
input: var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);
output: 6
function curryIt(fn) {
	// var args = [].slice.call(arguments, 1)
    // return fn.apply(this, args);
    return function(a) {
    	return function(b) {
    		return function(c) {
    			return fn.call(this, a, b, c);
    		}
    	}
    }
}

var fn = function (a, b, c) {
	return a + b + c;
};

// console.log( curryIt(fn, 1, 2, 3) );
console.log( curryIt(fn)(1)(2)(3) );

  

猜你喜欢

转载自www.cnblogs.com/mingzhanghui/p/9248682.html