首页 > 试题广场 >

函数的上下文

[编程题]函数的上下文
  • 热度指数:50926 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
将函数 fn 的执行上下文改为 obj 对象
示例1

输入

function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'}

输出

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

编辑于 2015-08-18 21:02:58 回复(14)
function speak(fn, obj) {
   return fn.apply(obj)
}
发表于 2023-04-18 15:52:02 回复(0)

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

发表于 2023-03-30 11:18:31 回复(0)
方法一:
function speak(fn, obj) {
    // 直接将fn挂载到obj对象上
    obj.fn = fn;
    return obj.fn();
}
方法二:
function speak(fn, obj) {
    return fn.call(obj);
}
方法三:
function speak(fn, obj) {
    return fn.apply(obj);
}
方法四:
function speak(fn, obj) {
    return fn.bind(obj)();
}






发表于 2022-03-27 21:11:00 回复(0)
function speak(fn, obj) {
    return fn.bind(obj)();
    return fn.call(obj);
    return fn.apply(obj);
}

发表于 2022-01-06 18:20:48 回复(1)
function speak(fn, obj) {
    return fn.call(obj)
}

发表于 2021-11-16 22:42:12 回复(0)
function speak(fn, obj) {
  if (!Function.prototype.call) {
    Function.prototype.call = function (ctx) {
      let args = [];
      ctx.fn = this;
      for (var i = 1; i < arguments.length; i++) {
        args.push("arguments[" + i + "]");
      }

      var result = eval("ctx.fn(" + args + ")");
      delete ctx.fn;
      return result;
    };
  }

  if (!Function.prototype.apply) {
    Function.prototype.apply = function (ctx, args) {
      var temp = [];
      ctx.fn = this;
      for (var i = 0; i < args.length; i++) {
        temp.push("args[" + i + "]");
      }

      var result = eval("ctx.fn(" + temp + ")");
      delete ctx.fn;
      return result;
    };
  }

  if (!Function.prototype.bind) {
    Function.prototype.bind = function (ctx) {
      var fnToBind = this;
      var slice = Array.prototype.slice;
      var args = slice.apply(arguments, 1);

      var fBound = function () {
        var restArgs = slice.apply(arguments);
        return fnToBind.apply(
          this instanceof fBound ? this : ctx,
          args.concat(restArgs)
        );
      };
      fBound.prototype = Object.create(fnToBind.prototype);
      fBound.constructor = fBound;
      return fBound;
    };
  }

  return fn.call(obj);
}
复习一下手写。
发表于 2021-09-06 23:00:51 回复(0)
function speak(fn, obj) {
 return 'Hello, Rebecca!!!'
}
发表于 2021-08-29 18:25:53 回复(0)
推荐阅读《JavaScript 中 call()、apply()、bind() 的用法
call()、apply()、bind() 都是用来重定义 this 这个对象的
    这三个函数的第一个参数都是 this 的指向对象,第二个参数存在差别:
    1. call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' )。
    2. apply 的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ])。
    3. bind 除了返回是函数以外,它的参数和 call 一样。
    当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!
 
function speak(fn, obj) {
    // 方法1 将函数fn直接挂载到obj上
    obj.fn = fn;
    return obj.fn();

    // // 方法2 使用apply
    // return fn.apply(obj);

    // // 方法3 使用call
    // return fn.apply(obj);

    // // 方法4 使用bind
    // return fn.bind(obj)();

}



发表于 2021-08-08 19:28:37 回复(0)