07.10.2008, 15:16
|
Флудер
|
|
Регистрация: 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}
вернёт одинаковый результат!
|
|
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.
|
|
07.10.2008, 15:48
|
Флудер
|
|
Регистрация: 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>
А про то, что браузеры делают из ИНТЕРПРЕТИРУМОГО языка полупрекомпилируемый - это отдельная песня.
|
|
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.
Причина: Поправил, вырезал нужный кусок.
|
|
07.10.2008, 17:37
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
и каккие это контексты?
|
|
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.
|
|
07.10.2008, 18:28
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Это я давно понял.
Я спрашивал: какие это контексты??? Как они называются и как они пересекаются/не пересекаются?
|
|
07.10.2008, 18:41
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
ZoNT,
Я не могу точно ответить, как они называются. Пересекаются они уже в scope, а контекст это либо тело функции, либо код в пределах одного файла/тега script (относительно JavaScript), который, как я понимаю, тоже рассматривается, как тело функции.
|
|
07.10.2008, 18:44
|
Флудер
|
|
Регистрация: 25.07.2008
Сообщений: 1,271
|
|
Ну ладно, не буду больше тебя мучать
|
|
07.10.2008, 19:04
|
|
|
Регистрация: 21.02.2008
Сообщений: 1,250
|
|
ZoNT,
А ты знаешь как они называются? Я полагаю, что это два контекста global code.
|
|
|
|