JavaScript:如何``.bind()``Function`到另一个对象

时间:2012-08-13 08:18:30

标签: javascript scope this v8

事实

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绑定到另一个对象?

感谢。

2 个答案:

答案 0 :(得分:1)

你基本上是这样做的:

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


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

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

答案 1 :(得分:0)

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

Function('return this').bind({})() // returns the empty Object