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

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

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

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

4

2 回答 2

8

我在这里找到了一些有用的信息: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 编写)与闭包没有这种区别。

于 2013-03-08T08:02:17.773 回答
0

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

于 2013-03-08T06:40:24.973 回答