function def() {
console.log(this.x)
}
var f = def.bind({ x:777 })
f() // prints 777
bind
创建的功能f
与def
相同,但在f
内,this
设置为{ x:777 }
。
是否可以访问绑定在f
之外的对象f
?例如,console.log(f.this.x)
(但这不起作用)。或者之后的代码是否无法查看绑定了哪个对象f
?
答案 0 :(得分:8)
我在bind
找到了一些有用的信息:
http://dmitrysoshnikov.com/notes/note-1-ecmascript-bound-functions/
bind
产生一种轻量级函数(在某些方面与通常的函数不同,如上面的链接所述。基本上它提供了一个用于调用目标函数的包装器,并维护内部包含目标函数,绑定this
和绑定参数的属性。由于这些是内部属性,因此无法以OP询问的方式访问它们(您无法使用任意绑定函数{ {1}}并执行f
)之类的操作。
值得注意的是,绑定在捕获某些状态时并不是唯一的。闭包也捕获状态。但是,f.getBoundThis()
(在ECMAScript 5中指定)是而不是一个闭包,因为闭包捕获变量而绑定捕获值。
以下是一个例子:
bind
(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
的一些先前实现(在ECMAScript 5之前用JavaScript编写)与闭包没有区别。
答案 1 :(得分:0)
不,您无法访问它,因为该对象仅在调用的生命周期内临时绑定到函数,它不会更改函数原型。