2 Stimmen

JavaScript: eine Funktion getrennt deklarieren und definieren?

Wenn ich einer JavaScript-Variablen einen globalen Geltungsbereich geben möchte, kann ich dies leicht tun:

var myVar;

function functionA() {
    myVar = something;
}

Gibt es einen ähnlich einfachen und sauberen Weg - ohne ein Objekt zu erstellen - um das "Deklarieren" und das "Definieren" einer verschachtelten Funktion zu trennen? Etwa so:

function functionB;       // declared with global scope

function functionA() {

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

Ich sollte klarstellen, dass ich mich auf den Geltungsbereich des Funktionsnamens selbst beziehe - so dass er, wenn er in einem Iframe steht, von einem Skript im übergeordneten Dokument aufgerufen werden kann. (Das hat nichts mit dem Geltungsbereich von Variablen innerhalb verschachtelter Funktionen zu tun).

1voto

cllpse Punkte 20838

Sie können globale Variablen und Funktionen erstellen, indem Sie Instanzen auf der Registerkarte window Objekt:

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

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

In Ihrem Fall müssen Sie jedoch nur Folgendes tun:

var myFn; // global scope function declaration

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

Hinweis: Es ist nie eine gute Idee, den globalen Bereich zu verstopfen. Wenn Sie können; Ich würde empfehlen, dass Sie überdenken, wie Ihr Code funktioniert, und versuchen, Ihren Code zu kapseln.

1voto

Tim Down Punkte 304837

Vielleicht verstehe ich die Frage falsch, aber es hört sich so an, als ob Sie etwas in dieser Art wollen:

var innerFunc;

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

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

1voto

BGerrissen Punkte 20514

Auf diese Weise können Sie keine Variablen/Funktionen über Windows/iframes hinweg globalisieren. Jedes Fenster/iframe hat seinen eigenen globalen Geltungsbereich, und um Variablen/Funktionen in einem anderen Fenster/iframe anzuvisieren, benötigen Sie expliziten Accessor-Code und müssen sich an die Politik des gleichen Ursprungs . Nur Variablen/Funktionen innerhalb des globalen Bereichs Windows/iframes sind zugänglich.

Code im oberen Fenster.

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

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

Sie könnten auch möglicherweise Funktionen/Variablen im oberen Fenster stattdessen definieren und einfach in einem Bereich arbeiten, indem Sie die Sachen, die Sie aus dem Iframe benötigen, durch eine Schließung binden. Wiederum unter der Voraussetzung, dass Sie die gleiche Herkunftsrichtlinie einhalten. Dies wird nicht domänenübergreifend funktionieren.

Code im Iframe.

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

Es ist auch wichtig zu beachten, dass Sie überprüfen müssen, ob Ihr Iframe-Inhalt und seine Skripte vollständig geladen sind. Ihre obere Seite/Fenster wird versehentlich fertig sein und laufen, bevor Ihr Iframe-Inhalt fertig ist, ergo sind Variablen/Funktionen möglicherweise noch nicht deklariert.

Was die Freigabe einer privaten Funktion betrifft, so haben andere dies bereits getan, aber ich kopiere und füge es der Vollständigkeit halber ein.

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

Ich habe die Angewohnheit, eigenständige Funktionen als Variablen zu deklarieren (Funktionsausdruck) und Funktionsanweisungen nur zur Kennzeichnung von Konstruktoren/Pseudoklassen zu verwenden. Das vermeidet auch ein paar mögliche peinliche Fehler. In jedem Fall befindet sich fnB im globalen Bereich des iframe und ist für das obere Fenster verfügbar.

Warum genau Sie das wollen, ist mir schleierhaft. Es scheint, dass es die Fehlersuche oder Aktualisierung ein paar Monate später komplizierter macht.

0voto

Fenton Punkte 221749

Sie können tun und lassen, was Sie wollen.

Sie können eine Funktion erstellen, die wie ein Namespace für Eigenschaften und Methoden fungiert, und dann können Sie im Wesentlichen entweder...

functionB();

o

functionA.functionB();

Hier finden Sie einen Artikel darüber, wie das geht:

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

Als Reaktion auf die Aktualisierung...

Befindet sich der iframe auf der gleichen Domäne wie die übergeordnete Website? Sie können JavaScript nicht über die Domänengrenze hinweg aufrufen, was das Problem erklären könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X