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

magistr_bender 06.10.2008 23:42

тест
 
вот прошол сегодня этот тестик http://javascript.ru/test
помнится когда только зарегился у меня было 20% результат...
а вот сегодня когда проходил тест было уже 55% а всё благодаря тому что уже месяц как тут сижу читаю и постю..
вообще интересная задумка.. жаль только что на самые простые казалось бы вопросы отвечаю не верно.. :(
а у кого ещё какие результаты?:)

magistr_bender 06.10.2008 23:52

кстати... вот что интересно в тесте про аякс (по которому у меня 64% )
Q:

Что нельзя сделать с помощью XmlHttpRequest ?
Ответы Правильный ответ Ваш ответ
Передать запрос другого типа кроме GET и POST невыбрано невыбрано
Отправить файл посетителя на сервер без <input type="file"> выбрано выбрано
Произвести запрос так, чтобы ответ был готов до следующей строки скрипта невыбрано невыбрано
Сделать запрос с http://duka.com на http://buka.duka.com невыбрано невыбрано
Сделать запрос с http://yandex.ru на http://google.com выбрано невыбрано

но, товарищи.. ведь на форуме есть топик о том, что всётаки послать XSS запрос по аяксу можно! и даже написанно как...
отсуда вывод... в тесте явная ошибка

Андрей Параничев 07.10.2008 00:35

magistr_bender,
Хак с window.name не имеет отношения к XmlHttpRequest.
Кстати,
Цитата:

Правильных ответов: 14 из 14.
Ваш результат: 100%
:)

magistr_bender 07.10.2008 09:06

ничего.. я ещё месяцок посижу тут и у меня будет 100% .. я просто попался на самых простых вопросах :(
тем более я то ещё толко аспирант))))

ZoNT 07.10.2008 11:00

что-то я совсем туплю:
там есть вопрос: Есть ли какая-нибудь разница между этими двумя определениями функции ?

function f(a,b) { return a+b }
var f = function(a,b) { return a+b }

Правильный ответ: да, есть.

Какая разница?

magistr_bender 07.10.2008 11:59

вот вот.. я ответил нет разницы.. ибо сам непойму в чём она состоит...

ZoNT 07.10.2008 13:22

по моему эти тесты надо сначала протестировать :)

Андрей Параничев 07.10.2008 13:50

ZoNT,
Именованная функция видна везде, анонимная - только после объявления.

ZoNT 07.10.2008 14:40

И где ты там увидел анонимную?

Kolyaj 07.10.2008 14:48

Цитата:

Сообщение от ZoNT
И где ты там увидел анонимную?

Имелось в виду variable definition.

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.

ZoNT 07.10.2008 21:14

если б я знал, я бы не спрашивал :)

Dmitry A. Soshnikov 07.10.2008 22:22

Цитата:

Сообщение от Kolyaj
Имелось в виду variable definition.

function-expression

Цитата:

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

не только анонимная, а function-expression. Вообще, function-expression не воздействует на variable object, однако в случае последующей привязки к var'у она все же доступна для вызова

Цитата:

Сообщение от ZoNT
какие это контексты???

каждый вызов функции (а также ее вызов в роли конструктора) создает новый контекст запуска; типы исполняемого кода: глобальный, eval, и тело функции (10.2 Entering An Execution Context)

ZoNT 08.10.2008 11:19

Цитата:

Сообщение от Dmitry A. Soshnikov
Сообщение от ZoNT
какие это контексты???
каждый вызов функции (а также ее вызов в роли конструктора) создает новый контекст запуска; типы исполняемого кода: глобальный, eval, и тело функции (10.2 Entering An Execution Context)

Я спрашивал про контексты в хэде и в боди. Какие это контексты?

Dmitry A. Soshnikov 08.10.2008 12:16

Цитата:

Сообщение от ZoNT
Я спрашивал про контексты в хэде и в боди.

хэд и боди к JS никак не относятся.

Цитата:

Сообщение от ZoNT
Какие это контексты?

глобальный контекст, но когда войдет в функцию - будет контекст функции (если затем функция запустит сама себя рекурсивно - создастся новый контекст, где тип исполняемого кода - тоже "функция")

ZoNT 08.10.2008 12:42

Ты пример смотрел?

Dmitry A. Soshnikov 08.10.2008 13:32

я те про пример и объясняю =) если что-то не понятно - спрашивай

Zeroglif 08.10.2008 13:32

Цитата:

Сообщение от ZoNT (Сообщение 6842)
Я спрашивал про контексты в хэде и в боди. Какие это контексты?

Контексты исполнения глобального кода каждого отдельного скриптового блока (2 штуки).

ECMAScript не распыляет "ECMAScript program" на несколько, все термины крутятся вокруг одной, в единственном числе. Соответственно, стек контекстов исполнения формируется в рамках одного единственного "execution of an ECMAScript program", около-html-ные вопросы, связанные с несколькими скриптовыми блоками, кодом в атрибутах элементов и проч. не рассматриваются вообще. Отсюда можно самому выдумать теорию, например:

а) каждый блок - это execution of an ECMAScript program, со своим собственным стеком контекстов исполнения, по html-коду ползает html-парсер, и каждый найденный им скриптовый кусок - это отдельно взятая программа, работающая по алгоритмам ES;

б) определяющим является единый для блоков глобальный объект (это самое важное), контекст исполнения глобального кода един на все блоки, конретизация (hoisting кому ближе) "переменных" в каждом блоке хоть и своя, но это обычно незаметно глазу, т.к. мало кто создаёт себе ошибки на этом фронте (пример не в счёт).

в) иное определение ситуации...

ZoNT 08.10.2008 13:42

вот этот ответ - правильный.

Контекст у каждого скриптового блока свой. Это логично. Ведь нельзя обратится к функции из другого блока, если этот блок ещё не загружен/исполнен. А загружен он может быть только если его вызов был РАНЬШЕ блока из которога вызывается функция.
Соответственно никакой пользы от var f= func... vs function f()... нет.
Только лишний гемморой с отладко тому человеку, который потом будет испоьзовать такой код и случайно разделит его по разным блокам.

Андрей Параничев 08.10.2008 14:10

ZoNT,
Не надо ставить все с ног на голову. Вопрос был в различиях между
function name() {} и var name = funciton() {} - они есть и описаны в спецификации.

ZoNT 08.10.2008 14:15

это один из тех примеров, которые НЕ нужно применять.
Из оперы: есть ли разница, ставить в конце строки ; или нет...

Zeroglif 08.10.2008 14:23

Цитата:

Сообщение от ZoNT
Соответственно никакой пользы от var f= func... vs function f()... нет

Дело не в пользе, а в том, что действительно различия есть:

1) время создания функции, FD как и переменная создаётся (наполняется значением) сразу же, а FE в рантайм;
2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain;
3) зависимость от места обитания, FE c именем именно потому FE, а не FD, ибо находится там, где может быть выражение;
4) разная реализация FE в трёх основных браузерах.

Цитата:

Сообщение от ZoNT
случайно разделит его по разным блокам

Обычно никто не вызывает после объявления (хотя можно), а уж вызывать раньше да ещё из-под другого блока - это из серии "обращение к элементу до его загрузки", только гораздо менее распространено...

Dmitry A. Soshnikov 08.10.2008 14:35

Zeroglif, о! =) приветствую и на этом форуме ;)

Цитата:

Сообщение от Zeroglif
2) опциональное имя для FE, когда согласно ES создаётся свой спецобъект, встраиваемый в scope chain;

это имеется в виду спецобъект для "моментального" вызова FE? и после этого (возможного) вызова, этот спецобъект удаляется из variable object'a, да?

Zeroglif 08.10.2008 15:15

Цитата:

Сообщение от Dmitry A. Soshnikov
это имеется в виду спецобъект для "моментального" вызова FE?

не для "моментального", а просто для обращения из функции к ней же по её (опциональному) имени, вот тут в конце немного обсуждали...

Цитата:

Сообщение от Dmitry A. Soshnikov
этот спецобъект удаляется из variable object'a, да?

Не удаляется и не из variable object-a. С каждым вызовом создаётся родной для функции Variable object, а всё что в стеке ниже статично и приходит из [[Scope]] (не путать со Scope), то есть спецобъект живёт в первоначальном с момента создания виде, как и все "чужие" для функции Variable objects в цепочке.

Dmitry A. Soshnikov 08.10.2008 15:49

Цитата:

Сообщение от Zeroglif
не для "моментального", а просто для обращения из функции к ней же по её (опциональному) имени

эм.. ну да, а когда функция может обратиться сама к себе: рекурсивно (раз) и (я образно обозвал) - "моментально" (два), т.е. (function() {})(); ну да, это я имел в виду

Цитата:

Сообщение от Zeroglif
Не удаляется и не из variable object-a.

а-а, т.е. он спецобъект сидит в скоп чейне, рядом с другими variable object'aми. Все, понял =) спасибо )

Цитата:

Сообщение от Zeroglif
[[Scope]] (не путать со Scope)

в смысле? [[Scope]] - скоп-чейн (набор variable object'ов + спецобъекты (их же может быть несколько) FE). А под Scope'ом что имеется в виду в данном случае?

Zeroglif 08.10.2008 16:42

Scope - это цепь объектов, опрашиваемых при вычислении идентификатора (scope chain), а [[Scope]] - это "закладка" на объекты, которые войдут в будущем (при исполнении функции) в состав Scope. Возьмём обыкновенную FunctionDeclaration, стоящую лексически в глобальном коде.

В момент её создания (при исполнении глобального кода):

- контекст исполнения --> контекст исполнения глобального кода
- Scope (scope chain) --> глобальный объект
- [[Scope]] функции --> глобальный объект

В момент вызова функции:

- контекст исполнения --> контекст исполнения функции
- Scope (scope chain) --> Variable object, глобальный объект
- [[Scope]] функции --> глобальный объект

Возьмём именованную FunctionExpresion там же, в глобальном коде:

В момент её создания (при исполнении глобального кода):

- контекст исполнения --> контекст исполнения глобального кода
- Scope (scope chain) --> глобальный объект
- [[Scope]] функции --> спецобъект*, глобальный объект

В момент вызова функции:

- контекст исполнения --> контекст исполнения функции
- Scope (scope chain) --> Variable object, спецобъект, глобальный объект
- [[Scope]] функции --> спецобъект*, глобальный объект

* спецобъект принудительно добавляется к Scope только на момент создания именованной FE исключительно для наполнения [[Scope]], после создания функции Scope возвращается к своему первоначальному состоянию, чтобы спецобъект не влиял на другие функции...

Dmitry A. Soshnikov 08.10.2008 23:50

Zeroglif,

Т.е. [[scope]] - это набор объектов, которые уже однозначно прописаны при создании функции. Эти объекты (родительские varibale object'ы и (возможные) спецобъекты) всегда будут приплюсованы к varible object'у функции в момент вызова. И в сумме, это и есть Scope функции, так?

Scope = variable object + [[scope]]

1. function F() {}; // создание

Функция F получила внутреннее свойство [[scope]] (по определению "[[scope]] - A scope chain that defines the environment in which a Function object is executed.") - в котором функция запущена - явно указывается, что это нечто родительское, поскольку сама функция находится в этом нечто. Или не правильная трактовка?

2. F(); // вызов

Для функци F динамически создается Scope (настоящий скоп чейн), который, как было сказано выше, состоит из variable object'a (это будет первый элемент Scope'a) и [[scope]]'a.

Цитата:

Сообщение от Zeroglif
спецобъект принудительно добавляется к Scope только на момент создания именованной FE

И этот спецобъект создается только для именованной FE (чтобы иметь возможность обратиться из самой FE по имени). Для анонимных же FE данный спецобъект не заводится и обращение внутри FE возможно лишь через argumetns.callee. Я правильно уловил?

Цитата:

Сообщение от Zeroglif
спецобъект принудительно добавляется к Scope только на момент создания именованной FE

Scope .... на момент создания. Или [[scope]]? Только что я понял, что окончательный Scope (если так можно сказать) - скоп, в котором будет производится поиск, будет определен в момент вызова, а не создания. В момент создания Scope вообще получается не нужен. Да и в примере спецобъект находится в [[scope]]:

- Scope (scope chain) --> глобальный объект
- [[Scope]] функции --> спецобъект*, глобальный объект

Или я здесь не до конца понял?

Как всегда, спасибо за подробные разъяснения =)

Zeroglif 09.10.2008 10:16

Цитата:

Сообщение от Dmitry A. Soshnikov
И в сумме, это и есть Scope функции, так?

Именно так.
Цитата:

Сообщение от Dmitry A. Soshnikov
Или не правильная трактовка?

Двусмысленная, ты правильно уловил намёк на "родительский" scope, надо было "executed" заменить на "created" и всё.
Цитата:

Сообщение от Dmitry A. Soshnikov
Я правильно уловил?

Правильно.
Цитата:

Сообщение от Dmitry A. Soshnikov
Scope .... на момент создания. Или [[scope]]?

Из Scope в [[Scope]]!

Scope (scope chain) - это объекты, ассоциированные с контекстом исполнения, не с функцией. Когда мы говорим о scope chain мы должны говорить только о контексте. При создании любой функции "запоминается" scope chain того контекста, где она создана, то есть scope chain сохраняется в [[Scope]]... навсегда. Но в этом scope chain нет спецобъекта, а он очень нужен именованной FE, поэтому при создании такой функции в Scope временно добавляется спецобъект и тут же удаляется оттуда, как только функция запомнит это в [[Scope]]. Таким образом после создания для всех остальных функций scope chain выглядит как обычно.
Цитата:

Сообщение от Dmitry A. Soshnikov
В момент создания Scope вообще получается не нужен.

[[Scope]] черпает информацию из Scope в момент создания.

Dmitry A. Soshnikov 09.10.2008 17:01

Zeroglif, ага, понял, thx =)

толкько вот:

Цитата:

Сообщение от Zeroglif
надо было "executed" заменить на "created" и всё

как же просто заменить, если это определение из ecma?

Dmitry A. Soshnikov 09.10.2008 17:29

Цитата:

Сообщение от ZoNT
Соответственно никакой пользы от var f= func... vs function f()... нет.

ну, если говорить не об отличиях, а о пользе - то это создание функций в рантайме

Zeroglif 09.10.2008 17:29

Цитата:

Сообщение от Dmitry A. Soshnikov
как же просто заменить, если это определение из ecma?

Там много двусмысленных определений, точный смысл которых раскрывается непосредственно в описании алгоритмов, такова уж плата за обобщения. ;)


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