最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Mastering Javascript Function.bind() - Stack Overflow

programmeradmin1浏览0评论
function def() {
    console.log(this.x)
}

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

The bind creates a function f which is identical to def, except that within f, this is set to { x:777 }.

Is it possible to access the object f was bound to outside of f? E.g., console.log(f.this.x) (but that doesn't work). Or is it impossible for code that es after to see what object f was bound to?

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

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

The bind creates a function f which is identical to def, except that within f, this is set to { x:777 }.

Is it possible to access the object f was bound to outside of f? E.g., console.log(f.this.x) (but that doesn't work). Or is it impossible for code that es after to see what object f was bound to?

Share Improve this question edited Mar 8, 2013 at 6:40 Tim Goodman 24k7 gold badges67 silver badges85 bronze badges asked Mar 8, 2013 at 6:18 exebookexebook 34k42 gold badges152 silver badges241 bronze badges 8
  • how can u call a f().. its not yet declared as funciton.. – sasi Commented Mar 8, 2013 at 6:25
  • bind changes the context of this inside a function but it doesn't execute it like call and apply. I don't see what's the point of your code. x won't be accessible I don't think so. – elclanrs Commented Mar 8, 2013 at 6:26
  • 1 So you're basically asking how to get the bound value of x from the this argument? – Blender Commented Mar 8, 2013 at 6:26
  • 1 I've expanded your question a bit, as I think you were getting some downvotes because people didn't understand what you were asking. I hope you don't mind. – Tim Goodman Commented Mar 8, 2013 at 6:41
  • 1 I have to disagree with the close vote. This is a perfectly legitimate question, which I would also like to know the answer to. He wants to know, given a function bound to an object using bind, is it possible to extract the bound object from the function – Tim Goodman Commented Mar 8, 2013 at 6:47
 |  Show 3 more ments

2 Answers 2

Reset to default 8

I found some useful information on bind here: http://dmitrysoshnikov./notes/note-1-ecmascript-bound-functions/

bind as specified in ECMAScript 5 produces a sort of lightweight function (which differs in some ways from usual functions, as described in the link above. Basically it provides a wrapper for calling the target function, and maintains internal properties which include the target function, the bound this, and the bound arguments. As these are internal properties, they aren't accessible in the way the OP is asking about (you can't take an arbitrary bound function f and do something like f.getBoundThis()).

It's worth noting that bind is not unique in capturing some state. Closures also capture state. However, bind (as specified in ECMAScript 5) is not a closure, because closures capture variables whereas bind captures values.

Here's an example:

(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

Some previous implementations of bind (written in JavaScript before ECMAScript 5) didn't have this distinction from closures.

No, you cannot access it because the object is only bound temporarily to the function for the lifetime of the call, it does not change the functions prototype.

发布评论

评论列表(0)

  1. 暂无评论