Rumah > Artikel > hujung hadapan web > Bercakap secara ringkas tentang pengikatan tersirat ini dalam pengetahuan JavaScript_Basic
Mari kita lihat contoh dahulu
function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2
Ini menunjuk kepada obj, kerana tapak panggilan apabila foo dilaksanakan (boleh difahami sebagai skop semasa memanggil) berada di atas obj. Ambil perhatian bahawa ia berada pada masa jalan dan tiada kaitan dengan tempat ia diisytiharkan.
tapak panggilan dan timbunan panggilan
Tapak panggilan difahami buat sementara waktu sebagai domain panggilan dan tindanan panggilan ialah timbunan panggilan. Kod berikut boleh membantu kami memahami
function baz() { // call-stack is: `baz` // so, our call-site is in the global scope console.log( "baz" ); bar(); // <-- call-site for `bar` }
Panggilan bar() dalam baz(), jadi domain panggilan bar ialah baz Pada masa ini, timbunan panggilan bar hanyalah baz dan baz itu sendiri didedahkan dalam skop global, jadi domain panggilannya juga mempengaruhi skop global dalam domain.
function bar() { // call-stack is: `baz` -> `bar` // so, our call-site is in `baz` console.log( "bar" ); foo(); // <-- call-site for `foo` } function foo() { // call-stack is: `baz` -> `bar` -> `foo` // so, our call-site is in `bar` console.log( "foo" ); } baz(); // <-- call-site for `baz`
Setelah memahaminya, lihat semula contoh pada permulaan dan ia akan menjadi lebih jelas. Malah, ini hanya menunjukkan kepada tapak panggilannya
Terdapat juga cara untuk bermain seperti berikut:
function foo() { console.log( this.a ); } var obj2 = { a: 42, foo: foo }; var obj1 = { a: 2, obj2: obj2 }; obj1.obj2.foo(); // 42 Implicitly Lost(隐式丢失) function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; var bar = obj.foo; // function reference/alias! var a = "oops, global"; // `a` also property on global object bar(); // "oops, global"
Walaupun bar merujuk kepada foo pada obj, ia sebenarnya bersamaan dengan merujuk terus foo, jadi ia akan terikat kepada global secara lalai.
function foo() { console.log( this.a ); } function doFoo(fn) { // `fn` is just another reference to `foo` fn(); // <-- call-site! } var obj = { a: 2, foo: foo }; var a = "oops, global"; // `a` also property on global object doFoo( obj.foo ); // "oops, global"