Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 07.10.2008, 15:16
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

что имелось ввиду???
Сообщение от Андрей Параничев
Именованная функция видна везде, анонимная - только после объявления.
alert(window.f);
function f(a,b){return a+b}

и
alert(window.f);
var f = function(a,b){return a+b}

вернёт одинаковый результат!
Ответить с цитированием
  #12 (permalink)  
Старый 07.10.2008, 15:34
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

ZoNT,
f(); // alerts "Hi"
function f() { alert("Hi") }

f(); // "f" is not a function
var f = function() { alert("Hi") };

Такое поведение в реальном документе\скрипте.
В firebug в обоих случаях функция недоступна выше объявления.

Последний раз редактировалось Андрей Параничев, 07.10.2008 в 15:38.
Ответить с цитированием
  #13 (permalink)  
Старый 07.10.2008, 15:48
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

???:
<html>
<head>
<script type="text/javascript">
f();
</script>
</head>
<body>
<script type="text/javascript">
function f(){alert("Hi")}
</script>
</body>
</html>


А про то, что браузеры делают из ИНТЕРПРЕТИРУМОГО языка полупрекомпилируемый - это отдельная песня.
Ответить с цитированием
  #14 (permalink)  
Старый 07.10.2008, 17:25
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

ZoNT,
В этом коде декларация и вызов находятся в разных execution contexts.

http://javascript.ru/ecma/part10#a-10
Цитата:
On entering an execution context, the properties are bound to the variable object in the following order:
...
- For each FunctionDeclaration in the code, in source text order, create a property of the variable object whose name is the Identifier in the FunctionDeclaration, whose value is the result returned by creating a Function object...
- For each VariableDeclaration or VariableDeclarationNoIn in the code, create a property of the variable object, whose value is undefined and whose attributes are determined by the type of code. Semantically, this step must follow the creation of the FormalParameterList and FunctionDeclaration properties. ...

Никакого отношения к прекомпиляции это не имеет.

Последний раз редактировалось Андрей Параничев, 07.10.2008 в 17:38. Причина: Поправил, вырезал нужный кусок.
Ответить с цитированием
  #15 (permalink)  
Старый 07.10.2008, 17:37
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

и каккие это контексты?
Ответить с цитированием
  #16 (permalink)  
Старый 07.10.2008, 17:51
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

ZoNT,
Управление JavaScript'у передается дважды, это два отдельных контекста.

Вкратце:
Когда интерпретатор входит в какой-то контекст (global/eval/function body) создается variable object который хранит в себе все декларации этого контекста. Если функция объявлена через FunctionDecloration (function Identifier(Params) {Body}), то она попадает в variable object под своим Identifier и её результатом уже будет объект Function. В случае VariableDecloration (var Identifier = ...) в variable object попадает свойство Identifier, но его значением будет undefined, пока оно не будет изменено в ходе выполнения скрипта.

Другими словами, функция заданная через FunctionDecloration доступна в variable object с уже "готовым" результатом, в отличии от VariableDecloration, где до того места, где она будет объявлена, её значение будет undefined.
Ответить с цитированием
  #17 (permalink)  
Старый 07.10.2008, 18:28
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

Это я давно понял.

Я спрашивал: какие это контексты??? Как они называются и как они пересекаются/не пересекаются?
Ответить с цитированием
  #18 (permalink)  
Старый 07.10.2008, 18:41
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

ZoNT,
Я не могу точно ответить, как они называются. Пересекаются они уже в scope, а контекст это либо тело функции, либо код в пределах одного файла/тега script (относительно JavaScript), который, как я понимаю, тоже рассматривается, как тело функции.
Ответить с цитированием
  #19 (permalink)  
Старый 07.10.2008, 18:44
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

Ну ладно, не буду больше тебя мучать
Ответить с цитированием
  #20 (permalink)  
Старый 07.10.2008, 19:04
Отправить личное сообщение для Андрей Параничев Посмотреть профиль Найти все сообщения от Андрей Параничев
 
Регистрация: 21.02.2008
Сообщений: 1,250

ZoNT,
А ты знаешь как они называются? Я полагаю, что это два контекста global code.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тест Redirect Общие вопросы Javascript 2 28.10.2008 00:08
Проблема обработки скрипта в Mozilla ermugard Firefox/Mozilla 2 18.06.2008 17:52
Новый тест Илья Кантор Сайт Javascript.ru 11 08.04.2008 18:04