首页 > 试题广场 >

函数的上下文

[编程题]函数的上下文
  • 热度指数:49976 时间限制: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)

分析题意:书写一个函数speak,该函数接收两个参数,一个是个函数fn,一个是个对象obj.希望将传入的函数的上下文绑定成传入的对象obj.
使得fn调用后,内部变量的值都取得obj的属性值.
因此,这是一道函数作为参数传入的高阶函数应用与call,apply方法知识点联合考查的题目

//解法一:利用call方法:
function speak(fn, obj) {
return fn.call(obj);
}
//解法二:利用apply方法:
function speak(fn, obj) {
return fn.call(obj);
}

发表于 2018-09-28 09:11:51 回复(0)
function speak(fn, obj) {
    if(fn.bind){ return fn.bind(obj)();} 
    else{ 
        return  fn.apply(obj,[]);
    }
        
}

发表于 2017-08-08 10:50:58 回复(0)
function speak(fn, obj) {
 return fn.apply(obj,obj);
}

发表于 2015-08-25 15:15:19 回复(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)
function speak(fn, obj) {
    return fn.apply(obj);
}
发表于 2020-03-24 18:20:39 回复(0)
js提供的call,apply,bind都可以,都通过了测试,只是在写法上有不同
fn.bind(obj)()

fn.call(obj)

fn.apply(obj,[])

发表于 2020-02-17 21:02:29 回复(0)
function speak(fn, obj) {
  //this的指向是动态变化的,需要把this的指向固定,所以就有了以下三种方法
  //call()、apply()、bind() 都是用来重定义 this 这个对象的
  //call 的参数是直接放进去的
  //apply 的所有参数都必须放在一个数组里面传进去
  //bind 除了返回是函数,它的参数和 call 一样
  return fn.apply(obj);
}

发表于 2019-09-12 14:55:56 回复(0)
发表于 2019-05-16 19:49:34 回复(0)
题目的说法是否有点问题啊,应该叫作修改函数的this指向吧。函数执行上下文不仅只有this
发表于 2017-04-23 12:40:34 回复(0)
function speak(fn, obj) {
	return fn.call(obj);
}

发表于 2016-08-05 21:35:58 回复(0)
function speak(fn, obj) {
return fn.call(obj,Array.prototype.slice.call(arguments).slice(2));
}
发表于 2016-03-31 16:34:42 回复(0)
绑定特定的执行环境,使用bind。 return fn.bind(obj)();
发表于 2016-05-22 18:27:29 回复(0)
//三种方案
//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)();
}

发表于 2016-08-29 10:55:12 回复(7)
我看题都看了半天没看懂!
发表于 2017-09-01 14:25:10 回复(10)
将fn的执行上下文改为obj对象,也就是说把fn的方法 放到 obj上执行(放到obj执行了,执行上下文当然是obj对象了)相当于把obj 的定义上下文改为 fn的,所以:
function speak(fn, obj) {
    return fn.apply(obj,[])
}
发表于 2016-09-26 15:07:47 回复(3)
function speak(fn, obj) {
    return fn.call(obj);
}
在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可。
发表于 2017-08-15 11:24:48 回复(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) {
  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 fn.call(obj);
}

测试通过!

发表于 2017-04-10 15:13:02 回复(0)