Wiki-учебник по веб-технологиям: JavaScript/ФункцииИмпортаИЭкспорта ...

Главная | Каталог |

Функции импорта и экспорта


Вам могут понадобиться интерфейсы для вызова в засекреченных контейнерах (окнах и слоях). Для этого используйте операторы import и export. Экспортирование имени функции делает её доступной для импорта скриптами, находящимися за пределами контейнера, без проверки контейнера.

Вы можете импортировать и экспортировать только функции – как функции верхнего уровня (ассоциированные с объектом window), так и методы некоторых других объектов. Вы не можете импортировать или экспортировать объекты целиком или свойства, которые не являются функциями.

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

Для использования import и export вы обязаны явно установить атрибут LANGUAGE тэга SCRIPT в «JavaScript1.2":

<SCRIPT LANGUAGE="JavaScript1.2">


В маркированном скрипте, который определяет функцию, доступ к которой вы хотите дать другим скриптам, используйте оператор export. Синтаксис этого оператора:

exportStmt ::= export exprList
exprList ::= expr | expr, exprList


где каждое expr обязано разрешаться в имя функции. Оператор export маркирует каждую функцию как импортируемую.

В скрипте, в который вы хотите импортировать функцию, используйте оператор import. Синтаксис этого оператора:

importStmt ::= import importList
importList ::= importElem | importElem, importList
importElem ::= expr.funName | expr.*


Выполнение import expr.funName вычисляет expr и импортирует функцию funName объекта в пределах текущей области видимости. Будет ошибкой, если expr не вычисляется в объект, если нет функции по имени funName или если функция существует, но не маркирована как импортируемая. Выполнение import expr импортирует все импортируемые функции из expr.

Пример

В это примере имеются три страницы в наборе фрэймов. Файл containerAccess.html определяет этот набор фрэймов и вызывает пользовательскую функцию, когда набор фрэймов загружен. Одна страница, secureContainer.html, содержит маркированный скрипт и экспортирует функцию. Другая страница, access.html, импортирует экспортируемую функцию и вызывает её.

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

Файл containerAccess.html содержит следующий код:

<HTML>
<FRAMESET NAME=myframes ROWS="50%,*" onLoad="inner.myOnLoad()">
<FRAME NAME=inner SRC="access.html">
<FRAME NAME=secureContainer SRC="secureContainer.html">
</FRAMESET>
</HTML>


Файл secureContainer.html содержит следующий код:

<HTML>
This page defines a variable and two functions. 
Only one function, publicFunction, is exported.
<BR>
<SCRIPT ARCHIVE="secureContainer.jar" LANGUAGE="JavaScript1.2" ID="a">
function privateFunction() {
   return 7;
}
var privateVariable = 23;
function publicFunction() {
   return 34;
}
export publicFunction;
netscape.security.PrivilegeManager.enablePrivilege(
   "UniversalBrowserRead");
document.write("This page is at " + history[0]);
// привилегии отменяются автоматически при окончании работы скрипта
</SCRIPT>
</HTML>


Файл access.html содержит следующий код:

<HTML>
This page attempts to access an exported function from a signed
container. The access should succeed.
<SCRIPT LANGUAGE="JavaScript1.2">
function myOnLoad() {
   var ctnr = top.frames.secureContainer;
   import ctnr.publicFunction;
   alert("value is " + publicFunction());
}
</SCRIPT>
</HTML>