Bercakap secara ringkas tentang pengikatan tersirat ini dalam pengetahuan JavaScript_Basic

WBOY
Lepaskan: 2016-05-16 15:14:22
asal
1125 orang telah melayarinya

Mari kita lihat contoh dahulu

function foo() {
  console.log( this.a );
}
var obj = {
  a: 2,
  foo: foo
};
obj.foo(); // 2
Salin selepas log masuk

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`
}

Salin selepas log masuk

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`
Salin selepas log masuk

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"
Salin selepas log masuk

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"
Salin selepas log masuk

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan