50道js能力测评经典题(2)——函数

函数

1. 函数传参

function argsAsArray(fn, arr) {
	return fn.apply(this, arr);
}

2. 函数的上下文

function speak(fn, obj) {
	return fn.apply(obj); // return fn.call(obj);
}

3. 返回函数

function functionFunction(str) {
	return f = function(s) {
		return str + ', ' + s;
	}
}

function functionFunction(str) {
	return function() {
		return str + ', ' + arguments[0];
	}
}

4. 使用闭包

详解:http://www.nowcoder.com/profile/878925/codeBookDetail?submissionId=1634608

function makeClosures(arr, fn) {
	var result = [];
	for(var i = 0; i < arr.length; i++) {
    	var tmp = (function(num) {
    		return function(){
            	//return fn(arr[num]);
            	return fn.call(this, arr[num]);
        	}
   		})(i)
		result.push(tmp);
	}
	return result;
}

5. 二次封装函数

function partial(fn, str1, str2) {
	return function(str3){
		return fn(str1,str2,str3);
	}
}

function partial(fn, str1, str2) {
	return function(str3) {
    	return fn.call(this, str1, str2, str3);
	}
}

6. 使用 arguments

function useArguments() {
	var sum = 0;
	for(var i=0; i<arguments.length; i++) {
    	sum += arguments[i];
  	}
	return sum;
}

7. 使用 apply 调用函数

arguments 不是真正意义上的数组,需要先转换成数组。var args = Array.prototype.slice.call(arguments)

function callIt(fn) {
	var arr = [];
	for(var i=1; i<arguments.length; i++) {			//注意for循环起始条件
    	arr.push(arguments[i]);
	}
	return fn.apply(fn,arr);
}

8. 二次封装函数

arguments 转换数组避免循环的方法尚未测试通过。

function partialUsingArguments(fn) {
	var arr = [];
	for(var i = 1; i < arguments.length; i++) {
    	arr.push(arguments[i]);
	}
	var result = function() {
    	var arr2 = [];
    	for(var i = 0; i < arguments.length; i++) {
        	arr.push(arguments[i]);
    	}
    	return fn.apply(this, arr);
	}
	return result;
}

function partialUsingArguments(fn) {
	var s=Array.prototype.slice.call(arguments,1);
	var result=function(){   
		return fn.apply(this,s.concat([].slice.call(arguments)));
	};
	return result;
}

9. 柯里化

function curryIt(fn) {
	var arr = [];
	var len = fn.length;
	return function(n) {
		arr.push(n);
		return arr.length < len ? arguments.callee : fn.apply(null,arr);
	}
}
Table of Contents