2009-11-18 8 views
0

Le script suivant produit « Bonjour », « non défini », « Hello » boîtes de message:fonction JavaScript comme rappel

function action(callback) { 
    window.setTimeout(callback, 1000); 
} 

var obj = { 
    text: "Hello", 
    f: function() { window.alert(this.text); } 
}; 

obj.f(); // Line 1 
action(obj.f); // Line 2 
action(function() { obj.f(); }); // Line 3 

Je recherche d'explication pourquoi la ligne marquée comme « Ligne 2 » produit une sortie « non défini » .

+1

Les meilleures réponses sur 'ce sujet': http://stackoverflow.com/questions/80084/in-javascript-why-is-the- ce-opérateur incompatible avec/80478 # 80478 et http://stackoverflow.com/questions/541167/what-is-the-rationale-for-the-behavior-of-the-this-keyword-in-javascript/542060# 542060 –

+0

La première référence est vraiment bonne – LicenseQ

Répondre

3

en JavaScript, this n'est pas lié à la méthode (comme dans python). Ligne 2 résultats en seulement la fonction appelée, et this est indéfini ou non obj

2

Lorsque vous appelez line2: Vous ne faites que passer la fonction dans le paramètre. Puisque vous ne faites que passer la fonction, pas l'objet entier, quand il est appelé, this dans la fonction ne fait pas référence à obj, ce qui rend this.text indéfini.

+2

En fait, _this_ dans ce contexte signifie l'objet global - dans ce cas, _window_ –

+0

mise à jour de l'explication – mauris

0

Le second vous passez une fonction sans portée donc ce devient l'objet le plus haut dans la chaîne de portée. La troisième façon que vous créez une fermeture et appeler f sur l'objet directement, ce qui laisse cette la portée appropriée.

1

Alot des bibliothèques JS faire quelque chose comme ceci:

if (!Function.prototype.context) { 
    Function.prototype.context = function (object) { 
     var fn = this; 
     return function() { return fn.apply(object, arguments); }; 
    }; 
} 

Pour pouvoir passer/bind this à un gestionnaire. Donc, dans votre cas, vous pouvez faire smthg comme ce

action(obj.f.context(obj)); 

et recevez votre « Bonjour ». Et oui, c'est une façon générale de faire quelque chose que vous avez fait à l'étape 3.