JavaScript:如何将`.bind()``Function`绑定到另一个对象 事实

JavaScript:如何将`.bind()``Function`绑定到另一个对象 事实,javascript,scope,this,v8,Javascript,Scope,This,V8,函数('returnthis')()始终返回全局(窗口)对象Function.bind({})('returnthis')()也返回全局对象 我的目标 我想创建函数的变体。通过调用Function的变体返回的匿名函数应始终使用myObj作为this 如果JavaScript不会以这种特殊方式运行(请参阅事实),我将执行以下操作: var myFun = Function.bind(myObj); console.assert(myObj === myFun('return this')());

函数('returnthis')()
始终返回全局(窗口)对象
Function.bind({})('returnthis')()
也返回全局对象

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

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

var myFun = Function.bind(myObj);
console.assert(myObj === myFun('return this')());
myFun
是我想要拥有的对象。现在我可以做以下工作:

var myFun = Function.bind(myObj);
console.assert(myObj === myFun('return this')());
我的问题
  • 为什么
    函数
    返回
    全局
    ,即使在
    .bind()
    将其绑定到另一个对象之后
  • 有解决办法吗?如何将
    函数
    绑定到另一个对象

谢谢。

我不知道您到底想实现什么,但您的方法链接顺序似乎不正确

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

你基本上是这样做的:

Function.call({}, 'return this;')();
函数
函数在新匿名对象的上下文中执行。这样做不会影响
函数生成的函数的上下文。事实证明,
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);
    }
}());
现在可以调用
函数('returnthis',myObj)()
并返回
myObj


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

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

谢谢,在这个用例中我很好但是我想创建一个
函数
本身的变体,而不是由
函数
创建的函数的变体。我想要像
var myFun=Function.bind(myObj)
这样的东西作为变量的结果。如果我使用的是你的解决方案,我不能做这样的事情-那么我需要将
.bind()
函数所产生的每一个
都分开。嗯,要么我对JavaScript了解不够,要么我不理解你想法背后的基本原理。但在我看来,您似乎想要重载
.bind
的原型。如果我帮不上忙的话,我很抱歉。我延长了我的问题,以便弄清楚我的意思。我希望现在一切正常。”
我觉得你想重载.bind的原型:
”:这并不是我想的我不想对
.bind()
做任何事情,
bind()
只是我创建
函数的第二个版本的工具。我希望第二个版本的
函数(
var myFun=Function.bind(myObj);
)在被调用时返回特殊的匿名函数(
var myRetValue=myFun('returnthis')
)。关于这些匿名函数的特殊之处应该是:在这些返回函数的范围内,
this
应该引用
myObj
console.assert(myObj===myRetValue());
)。因此,这一切都是关于更改
Function()
调用返回的匿名函数的上下文我想表达的意思清楚吗?我希望如此。如果不是,请告诉我怎么了。