掌握Javascript Function.bind()

时间:2013-03-08 06:18:17

标签: javascript

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

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

bind创建的功能fdef相同,但在f内,this设置为{ x:777 }

是否可以访问绑定在f之外的对象f?例如,console.log(f.this.x)(但这不起作用)。或者之后的代码是否无法查看绑定了哪个对象f

2 个答案:

答案 0 :(得分:8)

我在bind找到了一些有用的信息: http://dmitrysoshnikov.com/notes/note-1-ecmascript-bound-functions/

ECMAScript 5中指定的

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)

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