emmm我用两种方法解出来了,一种比较复杂,另一种相对简单

function alterContext(fn, obj) {
      this.greeting = obj.greeting;
      this.name = obj.name;
      return this.greeting + ', ' + this.name + '!';
}

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象
call的参数是直接放进去,里面的参数用','隔开

function alterContext(fn, obj) {
    return fn.call(obj);
}

bind的参数除了返回的函数时数组之外,其他参数和call一样

function alterContext(fn, obj) {
    return fn.bind(obj)();
}

apply的所有参数必须放在一个数组中传进去(本题中没有体现)

function alterContext(fn, obj) {
    return fn.apply(obj);
}

我是菜鸡,如有错误,欢迎指正