JavaScript---函数问题

来源:互联网 发布:ipad怎么管理淘宝店铺 编辑:程序博客网 时间:2024/05/24 04:10

JavaScript—函数问题

一些简单的涉及JavaScript函数的问题测验


函数传参

将数组 arr 中的元素作为调用函数 fn 的参数
输入例子:
argsAsArray(function (greeting, name, punctuation) {return greeting + ‘, ’ + name + (punctuation || ‘!’);}, [‘Hello’, ‘Ellie’, ‘!’])

输出例子:
Hello, Ellie!

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

函数的上下文

将函数 fn 的执行上下文改为 obj 对象
输入例子:
speak(function () {return this.greeting + ‘, ’ + this.name + ‘!!!’;}, {greeting: ‘Hello’, name: ‘Rebecca’})

输出例子:
Hello, Rebecca!!!

function speak(fn, obj) {    return fn.apply(obj,obj)}/*在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可。*/

返回函数

实现函数 functionFunction,调用之后满足如下条件:
1、返回值为一个函数 f
2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ‘, ’
3、所有函数的参数数量为 1,且均为 String 类型
输入例子:
functionFunction(‘Hello’)(‘world’)

输出例子:
Hello, world

function functionFunction(str) {    var ret = Array.prototype.slice.call(arguments).join(', ');    console.log(ret);    var temp = function(str1) {        ret = [ret, Array.prototype.slice.call(arguments).join(', ')].join(', ');        return ret;    };    return temp;}functionFunction('Hello')('World');

使用闭包

实现函数 makeClosures,调用之后满足如下条件:
1、返回一个函数数组 result,长度与 arr 相同
2、运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同
输入例子:
var arr = [1, 2, 3];
var square = function (x) {
return x * x;
};
var funcs = makeClosures(arr, square);
funcs1;

输出例子:
4

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

二次封装函数

已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
输入例子:
var sayIt = function(greeting, name, punctuation) { return greeting + ‘, ’ + name + (punctuation || ‘!’); }; partial(sayIt, ‘Hello’, ‘Ellie’)(‘!!!’);

输出例子:
Hello, Ellie!!!

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

使用 arguments

函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。
输入例子:
useArguments(1, 2, 3, 4)

输出例子:
10

function useArguments() {    return Array.prototype.slice.call(arguments).reduce(function(a,b){return a+b;});}

使用 apply调用函数

实现函数 callIt,调用之后满足如下条件
1、返回的结果为调用 fn 之后的结果
2、fn 的调用参数为 callIt 的第一个参数之后的全部参数
输入例子:
var a = 1; var b = 2; var test = function (first, second) { return first === a && second === b;}; callIt(test, a, b);

输出例子:
true

function callIt(fn) {   var arg=Array.prototype.slice.call(arguments,1);   return fn.apply(this,arg);}

二次封装函数

实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
输入例子:
var a = 1; var b = 2; var c = 3; var d = 4;var test = function (first, second, third, forth) {return first + second + third + forth;};partialUsingArguments(test, a, b)(c, d);

输出例子:
10

function partialUsingArguments(fn) {    var argu1=[];    argu1=Array.prototype.slice.call(arguments,1);    function result(){        var argu=[];        argu=Array.prototype.slice.call(arguments);        var res=argu1+','+argu;        console.log(res);        return fn.apply(this,argu1.concat(argu));    }    return result;}var a = 1; var b = 2; var c = 3; var d = 4;var test = function (first, second, third, forth) {return first + second + third + forth;};partialUsingArguments(test, a, b)(c, d);

柯里化

已知 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 的调用参数
输入例子:
var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);

输出例子:
6

function curryIt(fn) {    var args = [];    var len = fn.length;    return function (arg) {        args.push(arg);        if (args.length < len) {            return arguments.callee;        } else {            return fn.apply(this,args);        }    }}
0 0
原创粉丝点击