掌握Javascript函数.bind()

掌握Javascript函数.bind(),javascript,Javascript,bind创建一个与def相同的函数f,除了在f中,此设置为{x:777} 是否可以访问绑定到f外部的f对象?例如,console.log(f.this.x)(但这不起作用)。或者后面的代码不可能看到绑定到哪个对象吗?不,您无法访问它,因为该对象仅在调用的生命周期内临时绑定到函数,它不会更改函数原型。我在这里找到了一些关于绑定的有用信息: ECMAScript 5中指定的bind生成一种轻量级函数(在某些方面与上面链接中描述的常用函数有所不同。基本上,它提供了一个用于调用目标函数的包装器,并维护

bind
创建一个与
def
相同的函数
f
,除了在
f
中,
设置为
{x:777}


是否可以访问绑定到
f
外部的
f
对象?例如,
console.log(f.this.x)
(但这不起作用)。或者后面的代码不可能看到绑定到哪个对象吗?

不,您无法访问它,因为该对象仅在调用的生命周期内临时绑定到函数,它不会更改函数原型。

我在这里找到了一些关于
绑定
的有用信息:

ECMAScript 5中指定的
bind
生成一种轻量级函数(在某些方面与上面链接中描述的常用函数有所不同。基本上,它提供了一个用于调用目标函数的包装器,并维护内部属性,其中包括目标函数、绑定的
this
和绑定的参数。由于这些是内部属性,因此它们无法以OP的方式访问询问(您不能使用任意绑定函数
f
并执行类似
f.getBoundThis()
)的操作)

值得注意的是,bind在捕获某些状态时不是唯一的。闭包也捕获状态。但是,
bind
(如ECMAScript 5中所指定)不是闭包,因为闭包捕获变量,而bind捕获值

下面是一个例子:

function def() {
    console.log(this.x)
}

var f = def.bind({ x:777 })
f() // prints 777

以前的一些
bind
(在ECMAScript 5之前用JavaScript编写)实现与闭包没有这种区别。

如何调用f()…它还没有声明为function.
bind
在函数中更改
这个
的上下文,但它不像
调用
应用
那样执行它。我不明白你的代码有什么意义。
x
将无法访问,我不这么认为。所以你基本上是在问如何获得
x从
这个
论点?我把你的问题扩大了一点,因为我认为你得到了一些反对票,因为人们不明白你在问什么。我希望你不要介意。我不同意以接近票数投票。这是一个完全合理的问题,我也想知道答案。他想知道,给出答案n使用
bind
绑定到对象的函数,是否可以从函数中提取绑定对象,但如果绑定发生在某个函数中,然后返回绑定函数,该怎么办?那么您只有该函数,但绑定对象仍然存在。问题是您是否可以从函数i获取绑定对象t绑定到。当然这将打印
777
,但问题是,如果您只有一个对
bind()
返回的函数实例的引用,那么您能否访问绑定对象。两条注释的简短答案都是“是”。当然这取决于实现,但如果您可以:1)确保所有绑定函数返回
this
或2)将
this
赋值给绑定到外部函数的变量(不是很理想)
bind
call
apply
都返回它们正在执行的函数返回的值。Rob M.我不确定我是否理解您的答案。您的意思是说可以通过使用
apply()
call()
以某种方式访问绑定对象吗?@RobM.,我不确定您是否理解。如果我有一个函数
f
,它是使用
bind
创建的,就像在exebook的示例中一样,我如何提取传递给
bind
的对象?显然,如果我将对象存储在某个变量中,或者如果
f
返回该对象,那么我可以看到它。但在一般情况下,是否有某种方法可以读取给定的对象
f
。例如,我可以想象一个
f.this
,但它并不存在。
(function () {
    var x = 2;

    function thisSquared() { return this * this; }
    f = thisSquared.bind(x);

    g = function() { return x * x; } // g is a closure

    console.log(f()); // Squares the captured value (2), prints 4
    console.log(g()); // Squares x, prints 4

    x = 3;
})();

console.log(f()); // Squares the captured value (still 2), prints 4
console.log(g()); // Squares x, prints 9