Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   тест (https://javascript.ru/forum/offtopic/1927-test.html)

ZoNT 07.10.2008 15:16

что имелось ввиду???
Цитата:

Сообщение от Андрей Параничев
Именованная функция видна везде, анонимная - только после объявления.

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

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

вернёт одинаковый результат!

Андрей Параничев 07.10.2008 15:34

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

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

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

ZoNT 07.10.2008 15:48

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


А про то, что браузеры делают из ИНТЕРПРЕТИРУМОГО языка полупрекомпилируемый - это отдельная песня.

Андрей Параничев 07.10.2008 17:25

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. ...

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

ZoNT 07.10.2008 17:37

и каккие это контексты?

Андрей Параничев 07.10.2008 17:51

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.

ZoNT 07.10.2008 18:28

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

Я спрашивал: какие это контексты??? Как они называются и как они пересекаются/не пересекаются?

Андрей Параничев 07.10.2008 18:41

ZoNT,
Я не могу точно ответить, как они называются. Пересекаются они уже в scope, а контекст это либо тело функции, либо код в пределах одного файла/тега script (относительно JavaScript), который, как я понимаю, тоже рассматривается, как тело функции.

ZoNT 07.10.2008 18:44

Ну ладно, не буду больше тебя мучать :)

Андрей Параничев 07.10.2008 19:04

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


Часовой пояс GMT +3, время: 17:49.