Maison  >  Article  >  interface Web  >  Parlez brièvement de la liaison implicite de ceci dans les connaissances JavaScript_Basic

Parlez brièvement de la liaison implicite de ceci dans les connaissances JavaScript_Basic

WBOY
WBOYoriginal
2016-05-16 15:14:221113parcourir

Regardons d'abord un exemple

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

Cela pointe vers obj, car le site d'appel lorsque foo est exécuté (peut être compris comme la portée lors de l'appel) est au-dessus de obj. Notez qu'il est au moment de l'exécution et n'a rien à voir avec l'endroit où il est déclaré.

site d'appel et pile d'appels

Call-site est temporairement compris comme le domaine d'appel, et call-stack est la pile d'appels. Le code suivant peut nous aider à comprendre

function baz() {
  // call-stack is: `baz`
  // so, our call-site is in the global scope

  console.log( "baz" );
  bar(); // <-- call-site for `bar`
}

Appelez bar() dans baz(), donc le domaine appelant de bar est baz Pour le moment, la pile d'appels de bar n'est que baz et baz lui-même est exposé dans la portée globale, donc son domaine appelant affecte également. la portée mondiale dans le domaine.

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`

Après l'avoir compris, revenez à l'exemple du début et cela deviendra beaucoup plus clair. En fait, cela pointe simplement vers son site d'appel

Il existe également des façons de jouer comme suit :

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"

Bien que bar fasse référence à foo sur obj, cela équivaut en fait à référencer directement foo, il sera donc lié au global par défaut.

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"

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn