7
votes

Ce mot clé est l'objet de la fenêtre dans une fonction de constructeur

OK, alors je pensais que j'avais compris cela (aucun jeu de mots destiné), mais apparemment pas.

var Constructor = function () {
    var internalFunction = function () {
        return this === window;
    };
    this.myMethod = function () {
        alert(internalFunction());
    };
};
var myObj = new Constructor();
myObj.myMethod();


4 commentaires

Aucune des réponses à ces questions n'utilise que . Je me sens trahis.


@MissingNo: Je n'aime pas que . C'est non descriptif. Cela dit, mon propre choix de ma réponse n'est pas meilleur :)


+1 pour un jeu de mots non intentionnellement


Revenir des années plus tard ... J'ai tendance à utiliser la version minuscule du constructeur. Fonction Remarque () {var note = ceci; Je pense que cela fait pour une convention assez facile à lire.


4 Réponses :


1
votes

C'est un problème d'étendue, essayez quelque chose comme: xxx


0 commentaires

3
votes

en raison de règles de décodage fonctionnels, Ceci est réaffecté à l'intérieur de chaque fonction ... Je stockerais une copie de votre objet comme auto et utilisez-le en conséquence ... < pré> xxx

devrait vous donner la sortie que vous attendez.

sidenote

c'est un pratique assez précaire que JavaScript a créé, principalement parce que si vous oubliez le mot-clé nouveau lorsque vous utilisez constructeur , vous sera obtenir cette Se référant à l'objet Fenêtre (God) afin que vous attachez myMethod à la fenêtre sans avertissement.


0 commentaires

6
votes

Ce n'est pas lié tant que la fonction est appelée et dépend de la manière dont la fonction est appelée. Vous pouvez y penser comme un paramètre supplémentaire transmis implicitement à la fonction.

Dans ce cas, le problème est que vous appelez internalfunction à l'aide de internautier () . Le Cette valeur est défini soit en appelant une fonction sous forme de méthode (comme dans foo.bar () ou foo ["bar"] () ) ou en définissant ceci explicite via appel () ou appliquer () . Votre appel ne fait ni ce revient à l'objet global.

Le moyen le plus simple d'atteindre ce que vous voulez dans ce cas tout en gardant internalfunction privé est Pour stocker une référence à Ceci à l'intérieur de la fonction constructeur: xxx


2 commentaires

Ah, cela a du sens ... Ceci est attribué au moment de l'appel, donc en appelant internalfunction () J'appelle implicitement fenêtre.Internalfunction () < / code>. Bien expliqué.


@Jondavidjohn: Je ne sais pas une discussion à ce sujet et c'était un ajustement inutile au code d'origine de ma part, donc je l'ai révoqué. Merci de le pointer.



2
votes

Il y a cinq façons d'appeler une fonction dans JavaScript. La valeur de ceci dépend de laquelle vous choisissez:

  1. Appel de la fonction globale (E.G. MyFunction () ). Aucune valeur explicite pour Ce est donné. La valeur de ceci sera l'objet par défaut ( fenêtre dans un navigateur).
  2. Method Call (E.G. obj.myfunction () ). La valeur de ceci est l'objet sur lequel la méthode a été appelée ( obj dans ce cas).
  3. à l'aide de l'appel méthode (E.G. myfunction.call (obj) ). La valeur de ceci est fournie explicitement (dans ce cas obj ).
  4. à l'aide de la méthode Appliquer (E.G. myfunction.apply (obj) ). La valeur de ceci est fournie explicitement (dans ce cas obj ).
  5. FONCTION CONSTRUCTEUR (E.G. Nouveau MyFunction () ). La valeur de Ce est un objet nouvellement créé fourni par l'exécution.

    Chacun des cinq est expliqué plus en détail ici:


0 commentaires