3

事实

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

我的目标

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

如果 JavaScript 不会以这种特殊方式运行(请参阅The Facts),我会执行以下操作:

var myFun = Function.bind(myObj);

myFun是我想要拥有的对象。现在我可以做到以下几点:

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

我的问题

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

谢谢。

4

2 回答 2

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);
}
于 2012-08-13T16:48:15.057 回答
0

我不知道您到底要达到什么目的,但您的方法链接似乎顺序错误。

Function('return this').bind({})() // returns the empty Object
于 2012-08-13T09:14:36.343 回答