2010-08-14 5 views
2

Если я хочу дать JavaScript переменной глобального масштаба я могу легко это сделать: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 он может быть вызван из сценария в вышестоящем документе. (Нет ничего общего с объемом переменных внутри вложенных функций.)

+0

Интересно, что вы ищете с помощью чего-то подобного с javascript? –

+0

Amirouche - см. Разъяснение, которое я добавил к основному тексту вопроса ... –

+0

Кстати, все замечают, что когда я столкнулся с этой проблемой, да, я просто де-вложил эту функцию и решил проблему:) Я просто любопытно с теоретической точки зрения. –

ответ

0

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

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

functionB(); 

или

functionA.functionB(); 

Существует статья о том, как сделать это здесь:

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

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

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

+0

Посмотреть мой комментарий в ответе roosteronacid ... Tx –

+0

Все те же самые (на самом деле на локальном компьютере). У меня теперь работает код roosteronacid ... Thnx –

1

Вы можете создавать глобальные переменные и функции, создавая экземпляры на 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 
    { 
    }; 
} 

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

+0

Я обновил исходный вопрос, чтобы уточнить, что я пытаюсь получить доступ к вложенной функции в скрипте iframe из родительского скрипта. Я пробовал оба эти синтаксиса, но родительский скрипт, похоже, не может вызвать с ними вложенную функцию iframe - например. IFRAMEREFERENCE.contentWindow.myFn ничего не делает, IFRAMEREFERENCE.contentWindow.myFn() дает ошибку такую ​​функцию. –

+0

OK Я понял, что мне нужно сначала запустить randomFn(), чтобы получить код myFn «оценивается» (?), А затем я могу без проблем вызвать вызов myFn(). –

+0

Таким образом, этот код выражения функции полностью отвечает и решает исходный вопрос. Спасибо за вашу помощь. –

1

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

var innerFunc; 

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

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

См. Мой ответ на roosteronacid. Мне нужно вызвать эту вложенную функцию в iframe из родительского документа. Я не думаю, что можно каким-либо образом назвать ваш «внутренний» таким образом? –

+0

Да, есть: любая глобальная переменная (например, 'innerFunc' здесь) становится свойством глобального объекта, сопоставленного с объектом window в браузерах. 'document.getElementById (" your_iframe "). contentWindow.innerFunc()' будет делать это. –

+0

OK Я понял, что мне нужно сначала запустить externalFunc(), чтобы получить код innerFunc «оценен» (?), А затем я могу без проблем вызвать вызов innerFunc() из родителя. –

1

Вы не можете глобализовать переменные/функции пересекаются окна/IFrames таким образом. Каждое окно/iframe имеет свою собственную глобальную область действия и предназначено для целевых переменных/функций в другом окне/iframe, вам нужен явный код доступа и соответствует same origin policy. Доступны только переменные/функции внутри глобальной области данных 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.

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

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

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

+0

ВЫПУСК 1. Вы говорите: * «Вы не можете глобализовать [...] функции cros windows/iframes таким образом» *. Я подозреваю, что это ответ на мой вопрос. Функция в iframe должна быть объявлена ​​и определена в глобальном пробеле сценария iframe, чтобы родительский скрипт мог его вызвать. –

+0

ВОПРОС 2. Вы говорите: * «Вы не можете глобализовать переменные [... in ...] iframes таким образом» *. Для переменных в iframe он, конечно, работает, чтобы объявить их в глобальном пробеле и определить их локально. Возможно, вы имеете в виду какой-то расширенный синтаксис, чтобы «выставить» локально объявленную переменную в глобальную область iframe ...? –

+0

ВОПРОС 3. Когда вы говорите: * «var iframeContext = iframe.document || iframe.contentWindow.document» * - это настоящий «ИЛИ» код или псевдокод, указывающий мой выбор для использования? –

Смежные вопросы