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
绑定到什么对象?
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
绑定到什么对象?
我在这里找到了一些有用的信息:http bind
:
//dmitrysoshnikov.com/notes/note-1-ecmascript-bound-functions/
bind
正如 ECMAScript 5 中所指定的那样,产生一种轻量级函数(在某些方面与通常的函数不同,如上面的链接中所述。基本上它提供了一个用于调用目标函数的包装器,并维护包括目标函数的内部属性, boundthis
和绑定参数。由于这些是内部属性,因此无法以 OP 询问的方式访问它们(您不能采用任意绑定函数f
并执行类似的操作f.getBoundThis()
)。
值得注意的是,bind 在捕获某些状态时并不是唯一的。闭包也捕获状态。但是,bind
(如 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
一些以前的实现bind
(在 ECMAScript 5 之前用 JavaScript 编写)与闭包没有这种区别。
不,您无法访问它,因为该对象仅在调用的生命周期内临时绑定到该函数,它不会更改函数原型。