来源:牛客网 链接:https://www.nowcoder.com/ta/js-assessment
1.
//将数组 arr 中的元素作为调用函数 fn 的参数
function argsAsArray(fn, arr) {
return fn.apply(this,arr);
}
2.
//将函数 fn 的执行上下文改为 obj 对象
function speak(fn, obj) {
return fn.call(obj);
}
3
//实现函数 functionFunction,调用之后满足如下条件:
//1、返回值为一个函数 f
//2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', '
//3、所有函数的参数数量为 1,且均为 String 类型
function functionFunction(str) {
return f=function(s){
return str+', '+s;
};
}
4.使用闭包
//实现函数 makeClosures,调用之后满足如下条件:
//1、返回一个函数数组 result,长度与 arr 相同
//2、运行 result 中第 i 个函数,即 result[i](),结果与 fn(arr[i]) 相同
//评论中很好的总结了闭包问题https://www.nowcoder.com/questionTerminal/578026cd24e3446bbf27fe565473dc26
/*常犯错误
function makeClosures(arr, fn) {
var result=[];
for(var i=0;i
result[i]=function(){
return fn(arr[i]);
};
}
return result;
}
*/
function makeClosures(arr, fn) {
var result=[];
for(var i=0;i
return function(){
return fn(num);
};
}(arr[i]);
}
return result;
}
5.
//已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
//1、返回一个函数 result,该函数接受一个参数
//2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
function partial(fn, str1, str2) {
return f=function(str3){
return fn(str1,str2,str3);
}
}
6.
//函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。
function useArguments() {
var sum=0;
for(var i=0;i
}
return sum;
}
7.
//实现函数 callIt,调用之后满足如下条件
//1、返回的结果为调用 fn 之后的结果
//2、fn 的调用参数为 callIt 的第一个参数之后的全部参数
function callIt(fn) {
var arg=Array.prototype.slice.call(arguments,1);
var res=fn.apply(this,arg); //不能直接使用fn(arg),因为fn中的参数为具体的参数,非一个数组
return res;
}
8.
//实现函数 partialUsingArguments,调用之后满足如下条件:
//1、返回一个函数 result
//2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
//3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
function partialUsingArguments(fn) {
var a=Array.prototype.slice.call(arguments,1);
var result=function(){
var b=Array.prototype.slice.call(arguments);
return fn.apply(this,a.concat(b));
}
return result;
}
9.
//已知 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 的调用参数
function curryIt(fn) {
return a=function(str1){
return b=function(str2){
return c=function(str3){
return fn(str1,str2,str3);
}
}
}
}
10.
//返回参数 a 和 b 的逻辑或运算结果
function or(a, b) {
return a||b;
}