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

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

は、が に設定されていることを除いて、と同じbind関数を作成します。fdeffthis{ x:777 }

f外部にバインドされたオブジェクトにアクセスできますfか? たとえば、console.log(f.this.x)(しかし、それは機能しません)。それとも、その後に続くコードがどのオブジェクトfにバインドされているかを確認することは不可能ですか?

4

2 に答える 2

8

ここでいくつかの有用な情報を見つけましbindた: http://dmitrysoshnikov.com/notes/note-1-ecmascript-bound-functions/

bindECMAScript 5で指定されているように、一種の軽量関数を生成します(上記のリンクで説明されているように、通常の関数とはいくつかの点で異なります。基本的に、ターゲット関数を呼び出すためのラッパーを提供し、ターゲット関数を含む内部プロパティを維持しますbound this、およびバインドされた引数. これらは内部プロパティであるため、OP が求めている方法ではアクセスできません (任意のバインドされた関数fを取得して、 のようなことを行うことはできませんf.getBoundThis())。

bind は、特定の状態をキャプチャする際に一意ではないことに注意してください。クロージャは状態もキャプチャします。ただし、bind(ECMAScript 5 で指定されているように) はクロージャーではありません。クロージャーは変数をキャプチャするのに対し、バインドは値をキャプチャするためです。

次に例を示します。

(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 に答える