首页 > 试题广场 >

修改 this 指向

[编程题]修改 this 指向
  • 热度指数:118606 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
封装函数 f,使 f 的 this 指向指定的对象
示例1

输入

输出

推荐
function bindThis(func, oTarget) {
    return function(){
        return func.apply(oTarget, arguments);
    };
}

function bindThis(f, oTarget) {
return  f.bind(oTarget);
}
两种方法都可以
编辑于 2016-03-23 10:54:52 回复(17)
function bindThis(f, oTarget) {
            oTarget = oTarget || window || global
            const sign = "callTest"+Date.now()
            oTarget[sign] = f
            return function(...args){
                return oTarget[sign](...args)
            }
        }
发表于 2023-01-12 11:07:20 回复(0)
return f.bind(oTarget)

发表于 2022-11-20 22:25:10 回复(0)
这么理解吧
// call    // obj+参数s
// apply // obj+数组
// bind   // 返回一个函数
function bindThis(f, oTarget) {
            return function () {
                return f.call(oTarget, ...arguments)
            }
        }
        function bindThis(f, oTarget) {
            return function () {
                return f.apply(oTarget, [...arguments])
            }
        }
        function bindThis(f, oTarget) {
            return f.bind(oTarget)
        }


发表于 2022-11-13 09:26:03 回复(0)
function bindThis(f, oTarget) {
    return f.bind(oTarget);
}

发表于 2022-09-30 10:15:26 回复(0)
function bindThis(f, oTarget) {
    return f.bind(oTarget);
}

发表于 2022-02-14 16:08:55 回复(0)
function bindThis(f, oTarget) {
    return f.bind(oTarget)
}
发表于 2022-02-11 17:40:41 回复(0)
function bindThis(f, oTarget) {
    return f.bind(oTarget) || function() { return f.apply(oTarget,arguments) || f.call(oTarget, ...arguments);};
}

发表于 2021-10-18 11:00:29 回复(0)
想问一下,这里(2,3)传值为啥可以这样传,这里不懂,感谢解答
发表于 2021-10-14 22:56:54 回复(0)
function bindThis(f, oTarget) {
   return function(...arguments){
       return f.apply(oTarget,arguments)
   }
}
发表于 2021-10-10 19:46:00 回复(0)
输入:无
输出:无

答案需要返回一个函数……
发表于 2021-09-30 15:17:35 回复(0)
请问在实际开发中哪里需要用到重定向?个人感觉如果要写静态完全没必要用this,直接赋值不就好了。用call继承获取就好了,何必要什么重定向呢?完全不能理解这道题的意义是什么。
发表于 2021-09-23 10:21:32 回复(0)
function bindThis(f, oTarget) {
    return f.bind(oTarget)
}
发表于 2021-09-01 11:36:18 回复(0)
function bindThis(f, oTarget,...args) {
    return function(...newArg){
        return f.apply(oTarget,args.concat(newArg))
}
}
发表于 2021-08-06 11:27:08 回复(0)
干脆把call、apply、bind都手写一遍:
function bindThis (f, oTarget) {
  return f.myCall(oTarget, 1)
}

Function.prototype.myCall = function (context) {
  let ctx = Object(context) || globalThis
  let args = []
  // 遍历arguments
  for (let i = 1; i < arguments.length; i++) {
    args.push('arguments[' + i + ']')
  }
  // 利用obj隐式绑定规则
  ctx.fn = this
  let result = eval('ctx.fn(' + args + ')')
  delete ctx.fn
  return result
}

Function.prototype.myApply = function (context, arr) {
  let ctx = Object(context) || globalThis
  let result
  ctx.fn = this
  let args = []
  if (!arr) {
    result = ctx.fn()
  } else {
    for (let i = 0; i < arr.length; i++) {
      args.push('arr[' + i + ']')
    }
    result = eval('ctx.fn(' + args + ')')
  }

  delete ctx.fn
  return result
}

Function.prototype.myBind = function (context, ...args) {
  const fnToBind = this

  const fBound = function () {
    let concatArgs = args.concat(...arguments)
    return fnToBind.apply(this instanceof fBound ? this : context, concatArgs)
  }

  fBound.prototype = Object.create(fnToBind.prototype)
  fBound.prototype.contructor = fBound

  return fBound
}


发表于 2021-08-04 00:12:46 回复(0)
通过了。。。
function bindThis(f, oTarget) {
    oTarget.p = f
    return function fun(){
        return oTarget.p(...arguments)
    }
}


发表于 2021-07-26 11:09:50 回复(0)
function bindThis(f, oTarget) {
    return function (...c) {
        return f.call(oTarget,...c)
    }
}
发表于 2021-07-20 14:12:31 回复(0)