2010-08-14 15 views
2

Si je veux donner une portée globale variable JavaScript Je peux facilement faire ceci:JavaScript: déclarer et définir une fonction séparément?

var myVar; 

function functionA() { 
    myVar = something; 
} 

Y at-il une manière tout aussi simple et propre - sans créer un objet - de séparer le « déclarant » et « définir "d'une fonction imbriquée? Quelque chose comme:

function functionB;  // declared with global scope 

function functionA() { 

    functionB() {  // nested, would have local scope if declared here 
     CODE; 
    } 
} 

Je dois préciser que je fais référence à la portée du nom de la fonction elle-même - de telle sorte que si elle est dans un iframe il peut être appelé à partir d'un script dans le document parent. (Rien à voir avec la portée des variables dans les fonctions imbriquées.)

+0

Je me demande ce que vous cherchez avec quelque chose comme ça avec javascript? –

+0

Amirouche - voir la clarification que j'ai ajoutée au texte de la question principale ... –

+0

BTW tout le monde notez que quand je suis tombé sur ce problème, oui, je viens juste de-imbriqué la fonction et résolu le problème:) Je suis juste curieux d'un point de vue théorique. –

Répondre

0

Vous pouvez faire ce que vous voulez.

Vous pouvez créer une fonction qui agit comme un espace de noms pour les propriétés et méthodes, et vous pouvez appeler essentiellement soit ...

functionB(); 

ou

functionA.functionB(); 

Il y a un article sur la façon dont de le faire ici:

http://www.stevefenton.co.uk/Content/Blog/Date/201002/Blog/JavaScript-Name-Spacing/

En réponse à la mise à jour ...

L'iframe du même domaine que le site parent? Vous ne pouvez pas appeler JavaScript à travers la limite de domaine, ce qui peut expliquer le problème.

+0

Voir mon commentaire dans la réponse de roosteronacid ... Tx –

+0

Tous même domaine (en fait sur l'ordinateur local). J'ai le code de roosteronacid fonctionnant bien maintenant ... Thnx –

1

Vous pouvez créer des variables globales et fonctions en créant des instances sur l'objet window:

function _A() 
{ 
    // scoped function 
    function localFunctionInTheScopeOf_A() 
    { 
    } 

    // global function 
    window.globalFunctionOutsideTheScopeOf_A = function() 
    { 
    }; 
} 

Dans votre cas, cependant, tout ce que vous devez faire est la suivante:

var myFn; // global scope function declaration 

function randomFn() 
{ 
    myFn = function() // global scope function definition 
    { 
    }; 
} 

Note: Ce n'est jamais une bonne idée d'obstruer la portée mondiale. Si tu peux; Je vous recommande de repenser le fonctionnement de votre code et d'essayer d'encapsuler votre code.

+0

J'ai mis à jour la question originale pour clarifier que j'essaye d'accéder à une fonction imbriquée dans le manuscrit d'un iframe, d'un manuscrit de parent. J'ai essayé ces deux syntaxes, mais le script parent ne semble pas pouvoir appeler la fonction iframe imbriquée avec eux - par ex. IFRAMEREFERENCE.contentWindow.myFn ne fait rien, IFRAMEREFERENCE.contentWindow.myFn() donne l'erreur pas une telle fonction. –

+0

OK J'ai compris que j'ai besoin d'exécuter randomFn() d'abord, pour obtenir le code de myFn "évalué" (?), Et puis je peux appeler myFn() du parent sans aucun problème. –

+0

Donc, ce code d'expression de fonction répond et résout entièrement la question d'origine. Merci de votre aide. –

1

Peut-être que je suis mal compris la question, mais il semble que vous voulez quelque chose comme ceci:

var innerFunc; 

function outerFunc() { 
    var foo = "bar"; 

    innerFunc = function() { 
     alert(foo); 
    }; 
} 
+0

Voir ma réponse à l'acide de roosteron. J'ai besoin d'appeler cette fonction imbriquée dans un iframe, à partir d'un document parent. Je ne pense pas qu'il y ait moyen d'appeler votre "innerFunc" de cette façon? –

+0

Oui, il y a: toute variable globale (telle que 'innerFunc' ici) devient une propriété de l'objet global, mappée à l'objet window dans les navigateurs. 'document.getElementById (" your_iframe "). contentWindow.innerFunc()' le fera. –

+0

OK J'ai compris que je dois d'abord exécuter externalFunc(), pour obtenir le code de innerFunc "évalué" (?), Et puis je peux appeler innerFunc() du parent sans aucun problème. –

1

Vous ne pouvez pas globaliser les variables/fonctions des fenêtres à meneaux/Iframe de cette façon. Chaque fenêtre/iframe a sa propre portée globale et pour cibler des variables/fonctions dans une autre fenêtre/iframe, vous avez besoin d'un code d'accès explicite et conforme à la same origin policy. Seules les variables/fonctions à l'intérieur de la portée globale windows/iframes sont accessibles.

code dans la fenêtre supérieure.

var iframe = document.getElementById('iframeId'); 
var iframeContext = iframe.contentWindow || iframe; 

// this will only work if your iframe has completed loading 
iframeContext.yourFunction(); 

Vous pouvez également définir éventuellement des fonctions/variables dans la fenêtre du haut lieu et simplement travailler dans un champ en liant les choses dont vous avez besoin de l'iframe par une fermeture. Encore une fois, en supposant que vous répondez à la même politique d'origine. Cela ne fonctionnera pas dans le domaine croisé.

code en iframe.

var doc = document; 
var context = this; 
top.myFunction = function(){ 
    // do stuff with doc and context. 
} 

Il est également important de noter que vous devez vérifier si votre contenu iframe et il est des scripts sont entièrement chargés. Votre page/fenêtre supérieure ne sera pas exécutée et ne fonctionnera pas avant que votre contenu iframe soit terminé, les variables/fonctions ergo peuvent ne pas être encore déclarées.

En ce qui concerne l'exposition d'une fonction privée, d'autres ont répondu, mais copier/coller pour l'exhaustivité.

var fnB; 
var fnA = function(){ 
    var msg = "hello nurse!"; 
    fnB = function(){ 
     alert(msg); 
    } 
} 

J'ai l'Habitude de déclarer se fonctions uniquement en tant que variables (expression de fonction) et que les instructions de fonction de l'utilisation pour signifier constructeurs/pseudo-classes. Cela évite aussi quelques erreurs gênantes possibles. Dans tous les cas, fnB réside dans la portée globale de l'iframe et est disponible dans la fenêtre supérieure.

Pourquoi exactement vous voulez cela me bat, semble que cela complique la mise au point ou la mise à jour quelques mois plus tard.

+0

NUMÉRO 1. Vous dites: * "Vous ne pouvez pas globaliser [...] les fonctions cros windows/iframes de cette façon" *. Je soupçonne que c'est la réponse à ma question. Une fonction dans un iframe doit être déclarée et définie dans l'espace global du script iframe pour qu'un script parent puisse l'appeler. –

+0

PROBLÈME 2. Vous dites: * "Vous ne pouvez pas globaliser les variables [... dans ...] iframes de cette façon" *. Pour les variables dans un iframe, il fonctionne bien sûr pour les déclarer dans un espace global et les définir localement. Vous faites peut-être référence à une syntaxe avancée pour "exposer" une variable déclarée localement à la portée globale de l'iframe ...? –

+0

ISSUE 3. Quand vous dites: * "var iframeContext = iframe.document || iframe.contentWindow.document" * - est ce code "OU" réel, ou pseudo-code indiquant mon choix de quoi utiliser? –