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)
}