Rumah  >  Artikel  >  hujung hadapan web  >  Bercakap secara ringkas tentang pengikatan tersirat ini dalam pengetahuan JavaScript_Basic

Bercakap secara ringkas tentang pengikatan tersirat ini dalam pengetahuan JavaScript_Basic

WBOY
WBOYasal
2016-05-16 15:14:221113semak imbas

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"

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn