掌握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