函数上下文问题

1、将函数 fn 的执行上下文改为 obj 对象

//三种方案
//apply
function speak(fn, obj) {
    return fn.apply(obj);
}
//call
function speak(fn, obj) {
    return fn.call(obj);
}
//bind
function speak(fn, obj) {
    return fn.bind(obj)();
}

bind()返回的是一个目标函数并不调用,所以后面要加括号执行它
2、实现函数 functionFunction,调用之后满足如下条件:
(1)、返回值为一个函数 f
(2)、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', ’
(3)、所有函数的参数数量为 1,且均为 String 类型

//实现一个参数传值
function functionFunction(str) {
    return function a(s){
        return str+", "+s
    }
}
//实现多个参数传值
function functionFunction(str) {
    var ret = Array.prototype.slice.call(arguments).join(', ');//
    var temp = function(str) {
        ret = [ret, Array.prototype.slice.call(arguments).join(', ')].join(', ');//将函数的参数转换为数组之后在拼接为逗号空格隔开的字符串
        return temp;
    };
    temp.toString = function(){
        return ret;
    };
    return temp;
}

3、函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换
方法一:

function useArguments() {
    var args=Array.prototype.slice.call(arguments);//将所有参数转换为数组
     return eval(args.join("+"));//求和
}

方法二:

function useArguments() {
    var args=Array.prototype.slice.call(arguments);//将所有参数转换为数组
    return args.reduce(function (a,b){
        return a+b
    })
}

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

function callIt(fn) {
    var args=Array.prototype.slice.call(arguments,1);//将所有参数转换成数组之后再将第一个值去掉
    return fn.apply(this,args)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值