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 Réponses :
C'est un problème d'étendue, essayez quelque chose comme:
en raison de règles de décodage fonctionnels, devrait vous donner la sortie que vous attendez. p> sidenote strong> p> c'est un pratique assez précaire que JavaScript a créé, principalement parce que si vous oubliez le mot-clé Ceci code> est réaffecté à l'intérieur de chaque fonction ... Je stockerais une copie de votre objet comme
auto code> et utilisez-le en conséquence ... < pré> xxx pré>
nouveau code> lorsque vous utilisez
constructeur code>, vous forfr> sera strong> obtenir
cette Code> Se référant à l'objet Code> Fenêtre Code> (God) afin que vous attachez
myMethod code> à la fenêtre sans avertissement. p> p>
Dans ce cas, le problème est que vous appelez Le moyen le plus simple d'atteindre ce que vous voulez dans ce cas tout en gardant Ce code> 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.
internalfunction code> à l'aide de
internautier () code>. Le
Cette valeur code> est défini soit en appelant une fonction sous forme de méthode (comme dans
foo.bar () code> ou
foo ["bar"] () code] >) ou en définissant
ceci code> explicite via
appel () code> ou
appliquer () code>. Votre appel ne fait ni
ce code> revient à l'objet global. P>
internalfunction code> privé est Pour stocker une référence à
Ceci code> à l'intérieur de la fonction constructeur: p>
Ah, cela a du sens ... Ceci code> est attribué au moment de l'appel, donc en appelant
internalfunction () code> 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.
Il y a cinq façons d'appeler une fonction dans JavaScript. La valeur de Chacun des cinq est expliqué plus en détail ici: P>
ceci code> dépend de laquelle vous choisissez: p>
MyFunction () code>). Aucune valeur explicite pour
Ce code> est donné. La valeur de
ceci code> sera l'objet par défaut (
fenêtre code> dans un navigateur). LI>
obj.myfunction () code>). La valeur de
ceci code> est l'objet sur lequel la méthode a été appelée (
obj code> dans ce cas). LI>
myfunction.call (obj) code>). La valeur de
ceci code> est fournie explicitement (dans ce cas
obj code>). Li>
myfunction.apply (obj) code>). La valeur de
ceci code> est fournie explicitement (dans ce cas
obj code>). Li>
Nouveau MyFunction () Code>). La valeur de
Ce code> est un objet nouvellement créé fourni par l'exécution. LI>
ol>
Aucune des réponses à ces questions n'utilise
que code>. Je me sens trahis.
@MissingNo: Je n'aime pas
que code>. 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; code> Je pense que cela fait pour une convention assez facile à lire.