Ma suggestion serait d'éviter cette situation ainsi que d'éviter d'utiliser @marvel308's answer. Je ne déteste pas l'utilisateur bien sûr :) Je n'aime pas la lisibilité et la compréhensibilité que la réponse liée fournit malgré un bon effort. Bien que cela puisse être une solution, vous en aurez sûrement besoin à google chaque fois que vous la verrez utilisée, car elle n'est pas facile à comprendre. En fonction de ce que vous voulez, il existe plusieurs alternatives, vous pouvez repenser la structure de votre programme pour être plus "plat" par exemple. L'imbrication rend les choses plus complexes, donc éviter cela vous fera du bien la plupart du temps.
Maintenant, si imbrication n'est pas quelque chose qui est absolument nécessaire , vous pouvez opter pour cette solution beaucoup plus simple à la place, en utilisant de multiples fonctions définies au niveau supérieur:
function Person(name, age) {
this.name = name;
this.age = age;
}
function sayHelloToPerson(person) {
console.log("Hello! " + person.name + ", it seems you are: " + person.age + " years old");
}
en action:
var me = new Person("SidOfc", 22);
sayHelloToPerson(me);
// => "Hello! SidOfc, it seems you are: 22 years old"
Je ne peux pas être sûr de la facilité d'utilisation de ce code car le cas d'utilisation est trop claire, mais de cette façon, vous gardez l'intention claire et vous pouvez nous toujours Les arguments de la fonction pour transmettre toutes les données dont votre fonction a besoin (comme person
argument dans ce cas.).
Si vous, comme tous les autres développeur JS déteste là polluer l'espace de noms global, toutes les fonctions liées wrap à x
(Person
dans mon exemple) directement à l'intérieur au lieu de l'imbrication plus profond que 1 niveau. par exemple.
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() {
console.log("Hello! " + this.name + ", it seems you are: " + this.age + " years old");
this.sayGoodbye();
};
this.sayGoodbye = function() {
console.log("Goodbye! " + this.name);
}
}
en action:
var me2 = new Person("SidOfc", 22);
me2.sayHello();
// => "Hello! SidOfc, it seems you are: 22 years old"
// since sayHello calls this.sayGoodbye() we also get:
// => "Goodbye! SidOfc"
L'idée derrière cela est que vous créez toutes les fonctions qui sont liés à votre x
(Person
dans mon exemple) au même niveau d'imbrication.
Ils peuvent ensuite appeler d'autres fonctions et propriétés dans l'instance facilement sans ces structures d'imbrication folles.Aucun paramètre ne doit être ajouté puisque vous appelez la fonction que instance (bien sûr, cela va changer en fonction de vos besoins).
En prime, vous n'avez plus besoin de ce que vous demandez, car vous pouvez maintenant accéder à la fonction en utilisant me2.somefunction()
au lieu de devoir creuser profondément.
J'espère que je pourrais être utile;)
Quel est votre cas d'utilisation? Pour moi, cela semble peu clair, pourquoi aurait-on besoin de cela? Déclarez la fonction au niveau supérieur et ne vous embêtez pas à imbriquer à moins qu'il n'y ait absolument aucun moyen de contourner ce modèle terribad (sans infraction). Je pense que vous n'expliquez pas votre problème, mais plutôt le problème de votre solution. Peut-être que si nous connaissons l'idée derrière cela, nous pouvons vous donner une meilleure alternative à la place. – SidOfc