首页 > 试题广场 >

函数的上下文

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

call改变上下文this指针
发表于 2021-03-31 23:05:34 回复(0)
所以我这样也行?求解
function speak(fn, obj) {
    for(let el in obj){
        this[el]=obj[el]
    }
    return fn(obj)
}

发表于 2021-03-01 10:34:27 回复(0)
// 1. 使用 call
function speak(fn, obj) {
    return fn.call(obj)
}

// 2. 使用 apply
function speak(fn, obj) {
    return fn.apply(obj)
}

// 3. 使用 bind
function speak(fn, obj) {
    fn = fn.bind(obj)
    return fn()
}

发表于 2021-01-11 19:25:30 回复(0)
function speak(fn, obj) {
    obj.fn = fn;
    console.log(obj)
    return obj.fn();
}

发表于 2020-07-17 21:45:42 回复(0)
function speak(fn, obj) {
    return fn.apply(obj);
}

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

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

发表于 2019-09-03 16:43:46 回复(0)
function speak(fn, obj) {
    return fn.apply(obj);
}
发表于 2019-08-03 10:57:12 回复(0)
function speak(fn, obj) {
 return fn.apply(obj);
}
发表于 2018-10-21 13:20:39 回复(0)
发表于 2018-04-26 22:07:52 回复(0)
apply:调用一个对象的一个方法,用另一个对象替换当前对象。
B.apply(A,arguments);意思是A对象应用B对象的方法。
发表于 2018-02-27 12:00:32 回复(0)
function speak(fn, obj) {
    return fn.bind(obj)();
}
发表于 2017-04-12 16:21:37 回复(0)
注意,bind与call/apply的区别就在于,bind不会立即执行,所以
return (fn.bind(obj))()

发表于 2017-03-15 22:47:33 回复(0)
将fn的执行上下文改为obj对象,也就是说把fn的方法 放到 obj上执行(放到obj执行了,执行上下文当然是obj对象了)相当于把obj 的定义上下文改为 fn的,所以:
function speak(fn, obj) {
    return fn.apply(obj,[])
}
发表于 2016-09-26 15:07:47 回复(3)