2017-10-05 2 views
-1

Y a-t-il un moyen d'accéder à une fonction qui se trouve dans une fonction, qui se trouve dans une autre fonction de JavaScript?Comment accéder à la fonction JavaScript qui est en fonction qui est en fonction

function x(name, age) { 
 
    this.name = name; 
 
    this.age = age; 
 

 

 
    this.a = function() { 
 
    this.b = function() { 
 
     return "b"; 
 
    }; 
 

 
    return "a"; 
 
    }; 
 
} 
 

 
var xobj = new x('vin', 25); 
 
console.log(xobj.a.b()); //error

+0

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

Répondre

2

vous pouvez faire

function x(name, age){ 
 
this.name =name; 
 
this.age = age; 
 
    
 

 
this.a = function(){ 
 
\t \t \t 
 
\t \t this.b = function(){ 
 
\t \t \t return "b"; 
 
     }; 
 

 
\t return "a"; 
 
    }; 
 
    
 
} 
 

 

 
var xobj =new x('vin',25); 
 
var xx = new xobj.a(); 
 
console.log(xx.b());

vous devez déclarer une instance de x.a(), puis appelez b

Wh fr une fonction est utilisée comme constructeur (avec le nouveau mot-clé), elle est liée au nouvel objet en construction. donc Si vous voulez appeler cela à l'intérieur de la fonction a(), vous devrez créer un constructeur en utilisant new mot-clé

+3

Cela ressemble plus à un jeu de spot-the-différent d'une réponse. Qu'avez-vous changé? Pourquoi devrait-il résoudre le problème? – Quentin

+0

'xobj.a()' renvoie une chaîne '" a "' –

+0

non il ne le fera pas, il renverrait une instance de ceci à cause de l'opérateur ** new ** – marvel308

0

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;)