53 votes

Reportez-vous à la fonction javascript de l'intérieur

Considérer ce morceau de code

var crazy = function() {
    console.log(this);
    console.log(this.isCrazy); // wrong.
}
crazy.isCrazy = 'totally';
crazy();
// ouput =>
// DOMWindow
// undefined

De l'intérieur de fou () " il " se réfère à la fenêtre, qui je pense a du sens parce que, normalement, vous voulez ce faire référence à l'objet de la fonction est attachée, mais comment puis-je obtenir la fonction de renvoyer à lui-même, et l'accès à une propriété définie sur lui-même?

Réponse:

Ne pas utiliser d'arguments.le destinataire de l'appel, il suffit d'utiliser une fonction nommée.

"Remarque: Vous devez éviter d'utiliser des arguments.le destinataire de l'appel() et il suffit de donner à chaque fonction (expression) un nom." via MDN article sur les arguments.le destinataire de l'appel

31voto

KZ. Points 86

Je pense que vous demandez des arguments.callee.

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee

 var crazy = function() {
    console.log(this);
    console.log(arguments.callee.isCrazy); // right.
}
crazy.isCrazy = 'totally';
crazy();
// ouput =>
// DOMWindow
// totally
 

18voto

zupa Points 2634

Comme l'a dit rfw , c'est le moyen le plus simple de procéder si la fonction a un seul nom:

 var crazy = function() {
    console.log(crazy);
    console.log(crazy.isCrazy);
};

crazy.isCrazy = 'totally';
crazy();
 

Dans le cas où il pourrait avoir des noms différents, ou si vous vouliez le faire circuler, il doit être entouré d'une fermeture:

 var crazy = (function(){
    var that = function() {
        console.log(that);
        console.log(that.isCrazy);
    };
    return that;
})();

crazy.isCrazy = 'totally';
crazy();
 

5voto

rfw Points 3716

Vous devez lui donner son propre nom, donc:

 var crazy = function() {
    console.log(crazy);
    console.log(crazy.isCrazy);
}
crazy.isCrazy = 'totally';
crazy();
 

La variable this ne s'applique que dans la portée d'un objet, par exemple, si vous appelez votre version de la fonction crazy avec crazy.call(crazy) , elle appellera le fonction dans le contexte de la fonction crazy et tout irait bien.

2voto

BudgieInWA Points 1174

Vous pouvez utiliser la méthode call

 var crazy = function() {
    console.log(this);
    console.log(this.isCrazy);
}
crazy.isCrazy = 'totally';
crazy.call(crazy);
// calls crazy using crazy as the target, instead of window:
// functionToCall.call(objectToUseForThis);
 

Cependant, si votre fonction n'a jamais qu'un seul nom, vous pouvez le faire:

 var crazy = function() {
    console.log(crazy);
    console.log(crazy.isCrazy);
}
crazy.isCrazy = 'totally';
crazy();
 

1voto

rahulmohan Points 610

comment puis-je obtenir la fonction de renvoyer à elle-même?

L'idée de " soi " n'existe pas avec les fonctions. Ce que vous avez besoin est un objet et non pas seulement une fonction. Un objet a la connaissance de lui-même disponible via le mot-clé 'cette'. Au sein d'une fonction 'ce' points de l'objet global - dans ce cas, la fenêtre de l'objet. Mais si vous utilisez votre fonction comme une fonction constructeur pour créer un objet (à l'aide de la nouvelle - opérateur), l'objet de cette pointeur pointe vers l'objet lui-même.

j'.e cette points de l'objet, si vous écrivez:

var anObject = new crazy();

De sorte que vous pouvez ré-écrire votre code comme suit:

var crazy = function() {
    this.printMe = function(){
        console.log(this);
        console.log(this.isCrazy); 
    }
}

var anObject = new crazy(); //create an object
anObject.isCrazy = 'totally'; //add a new property to the object
anObject.printMe(); //now print

Dans le cas où vous souhaitez ajouter la propriété avant la création de l'objet, puis vous devez ajouter la propriété à la fonction de prototype comme suit:

var crazy = function() {
    console.log(this);
    console.log(this.isCrazy); 
}

crazy.prototype.isCrazy = 'totally'; //add the property to the function's prototype
var anObject = new crazy(); //invoke the constructor

En voir plus sur mon blog pour une explication détaillée de ces concepts avec code-échantillons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X