JavaScript: объявление и определение функции отдельно? - PullRequest
2 голосов
/ 14 августа 2010

Если я хочу дать глобальную область видимости переменной JavaScript, я легко могу сделать это:

var myVar;

function functionA() {
    myVar = something;
}

Существует ли такой же простой и чистый способ - без создания объекта - отделить "объявление"и "определение" вложенной функции?Что-то вроде:

function functionB;       // declared with global scope

function functionA() {

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

Я должен уточнить, что я имею в виду область действия самого имени функции - так что если оно находится в iframe, его можно вызвать из скрипта в родительском документе.(Ничего общего с областью действия переменных во вложенных функциях.)

Ответы [ 4 ]

1 голос
/ 14 августа 2010

Вы не можете глобализировать переменные / функции, пересекающие окна / фреймы таким образом.Каждое окно / iframe имеет свою собственную глобальную область видимости, и для назначения переменных / функций в другом окне / iframe вам необходим явный код доступа и соответствие той же политике происхождения .Доступны только переменные / функции внутри глобальной области видимости windows / iframes.

код в верхнем окне.

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

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

Вы также можете определить функции / переменные в верхнем окне и просто работатьв одной области, связывая вещи, которые вам нужны, от iframe до замыкания.Опять же, при условии, что вы соответствуете той же политике происхождения.Это не будет работать в междоменном коде.

в iframe.

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

Также важно отметить, что вам нужно проверить, полностью ли загружены ваш контент iframe и его сценарии.Ваша верхняя страница / окно будет по неосторожности завершена и запущена до того, как будет создан контент iframe, поэтому переменные / функции ergo могут быть еще не объявлены.

Что касается раскрытия приватной функции, то другие это заметили, но скопировали / вставилидля полноты.

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

У меня есть привычка объявлять автономные функции в качестве переменных (выражение функции) и использовать только операторы функций для обозначения конструкторов / псевдоклассов.Это также позволяет избежать нескольких возможных смущающих ошибок. В любом случае, fnB находится в глобальной области видимости iframe и доступен в верхнем окне.

Почему именно вы хотите, чтобы это меня било, кажется, это делает вопросы более важнымисложно отладить или обновить несколько месяцев спустя.

1 голос
/ 14 августа 2010

Вы можете создавать глобальные переменные и функции, создавая экземпляры объекта window:

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

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

В вашем случае, однако, все, что вам нужно сделать, это:

var myFn; // global scope function declaration

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

Примечание. Никогда не стоит забивать глобальную область видимости. Если ты можешь; Я бы порекомендовал вам переосмыслить, как работает ваш код, и попытаться инкапсулировать ваш код.

1 голос
/ 14 августа 2010

Возможно, я неправильно понимаю вопрос, но звучит так, будто вы хотите что-то вроде этого:

var innerFunc;

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

    innerFunc = function() {
        alert(foo);
    };
}
0 голосов
/ 14 августа 2010

Вы можете делать то, что хотите.

Вы можете создать функцию, которая действует как пространство имен для свойств и методов, и тогда вы можете по сути вызывать либо ...

functionB();

или

functionA.functionB();

Здесь есть статья о том, как это сделать:

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

В ответ на обновление ...

Является ли iframe тем же доменом, что и родительский сайт?Вы не можете вызывать JavaScript через границу домена, что может объяснить проблему.

...