JavaScript:如何将“.bind()”“函数”到另一个对象

JavaScript: How To `.bind()` `Function` to Another Object

本文关键字:函数 一个对象 bind JavaScript      更新时间:2023-09-26

事实

Function('return this')()始终返回全局(窗口)对象。 Function.bind({})('return this')()也返回全局对象。

我的目标

我想创建一个Function的变体。通过调用该变体返回的匿名函数Function应始终使用 myObj 作为this

如果 JavaScript 不会以这种特殊的方式运行(参见事实),我会执行以下操作:

var myFun = Function.bind(myObj);

myFun是我想拥有的对象。现在我将能够执行以下操作:

console.assert(myObj === myFun('return this')());

我的问题

  • 为什么Function返回global,即使将其.bind()到另一个对象?
  • 有解决方法吗?如何将Function绑定到另一个对象?

谢谢。

你本质上是在这样做:

Function.call({}, 'return this;')();

Function函数在新匿名对象的上下文中执行。 这样做不会影响 Function 生成的函数的上下文。 事实证明,Function并不关心它在什么上下文中运行 - 它总是生成具有默认全局上下文的函数。

如果要

指定由 Function 生成的函数的上下文,则需要像这样包装Function

// give our vars privacy in a closure
(function() {
    // store old Function
    var oldFunc = Function;
    // redefine Function to be a wrapper around the real Function
    // which takes an additional `context` argument
    Function = function(ftext, context) {
        return oldFunc(ftext).bind(context);
    }
}());

现在您可以调用Function('return this', myObj)();,它将返回myObj


或者,只需创建通过assert测试的建议myFun(text)语法:

var myFun = function(ftext) {
    return Function(ftext).bind(myObj);
}

我不知道你到底想实现什么,但似乎你的方法链接顺序错误。

Function('return this').bind({})() // returns the empty Object
相关文章: