Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Тест. Маленький, но развивает. (Zeroglif, оценка: 1)
Goto page 1, 2  Next
Author Message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Mon Sep 18, 2006 1:06 am (написано за 6 секунд)
   Post subject: Тест. Маленький, но развивает.
Reply with quote

Придумал небольшой вопросец типа на засыпку типа для тестирования типа знаний... ;-)
Code (JavaScript): скопировать код в буфер обмена
alert(
  function (){
      return function A(){
          return [(A = 'function', typeof A), A != typeof B, function B(){B = null; return typeof B}()];
      }()
  }()
);

// IE 6.0 -> string, false, object
// OP 9.0 -> string, true, object
// FF 1.5 -> function, true, function
 
Внимание, вопрос: Отчего разные результаты в разных браузерах, а главное - кто из них троих прав и почему?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Sep 18, 2006 8:58 am (спустя 7 часов 51 минуту; написано за 7 минут 59 секунд)
   Post subject:
Reply with quote

Zeroglif
Попробую ответить сразу на "главное". На мой взгляд "прав" IE - такой вывод я делаю отчасти на основе знаний, полученных от Вас же в теме var x=function(){} - в чем фишка? (forum.dklab.ru/js/other/VarXFunction-InWhatAChesspiece.html). Переписывать описание работы парсера из упомянутой темы не буду, т.к. вобщем-то там все и объясняется.
Забавно смотрится результат FF, как впрочем и Opera, которые, как выясняется, читают слева направо буквально как первоклассники по слогам, выдавая true, не подозревая о function B. Хотя, видимо, поэтому они иногда работают быстрее. Но IE выглядит предпочтительней, т.к. хорошенько все "обдумывает", прежде чем выдать результат.
Вот так вот видится мне все это...
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Mon Sep 18, 2006 11:29 am (спустя 2 часа 31 минуту; написано за 8 минут 7 секунд)
   Post subject:
Reply with quote

AKS wrote:
Zeroglif
Попробую ответить сразу на "главное".
Я пока тут промолчу, надеюсь, ещё кто-нибудь ответит на вопрос. Кроме вас.
Back to top
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Mon Sep 18, 2006 3:54 pm (спустя 4 часа 25 минут; написано за 41 секунду)
   Post subject:
Reply with quote

Я тоже согласен что ИЕ прав но ход мыслей лисы понять вообще не могу.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Sep 18, 2006 5:16 pm (спустя 1 час 21 минуту; написано за 21 секунду)
   Post subject:
Reply with quote

Zeroglif
Покопался в стандарте и сумел разобраться, почему FF ведет себя подобным образом. Если я все правильно понял, то ведет она себя как раз в соответствии со стандартом. Если, к примеру, для IE function A и function B - это FunctionDeclaration, то для FF - это FunctionExpression. А для FunctionExpression в стандарте есть заметка, что идентификатор не может влиять на функцию:
Quote:
...unlike in a FunctionDeclaration, the Identifier in a FunctionExpression cannot be referenced from (inside the FunctionExpression's FunctionBody) and does not affect the scope enclosing the FunctionExpression.
Что же, получается что FF предлагает самый стандартный результат? Ведь объявление функций (в соответствии со стандартом) должно осуществляться лишь в глобальной области видимости:
Quote:
Program functions are defined in source text by a FunctionDeclaration or created dynamically either by using a FunctionExpression...
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Mon Sep 18, 2006 7:03 pm (спустя 1 час 47 минут; написано за 22 секунды)
   Post subject:
Reply with quote

Хоть и FF такая вся из себя "стандартная", есть кое-что непонятное и в ее поведении. Версии до 2005г. выдают ошибку при вызове eval как метода объекта (оно и верно - ведь Deprecated&Obsolete), а вот нынешние снова обрабатывают такой вызов (Backward Compatibility называется):
Code (JavaScript): скопировать код в буфер обмена
alert(
  ((function() {
    return(eval('function B() { B = null; return typeof B;}'),
      eval.call(window, 'function A() { return [(A = "function", typeof A), A != typeof B, B()];}')
    )})(),
  A())
);
// FF 1.5 -> string, false, object
 
Что этим хочу сказать - тоже "скользко" страндарты трактуются...
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Sep 18, 2006 7:05 pm (спустя 2 минуты)
   Post subject:
Reply with quote

Лично мне кажется, что права опера, как это ни странно :). Ведь во втором результате В еще не определен, и его тип - undefined, и он не совпадает с string. А так как function A(){...} по идее должно быть эквивалентно A=function(){...}, то вполне логично, что эту глобальную переменную можно переопределить, и ее тип должен измениться на string.
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 9:36 am (спустя 14 часов 31 минуту; написано за 4 минуты 54 секунды)
   Post subject:
Reply with quote

Кое-что, имеющее отношение к поведению FF находится на этой странице (developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Functions). Особо хочется отметить парочку замечаний, которые имеются у них там в стандарте и могут немного "прояснить" ситуацию:
Code (JavaScript): скопировать код в буфер обмена
if (0)
   function zero() {
      document.writeln("This is zero.");
   }
Первое: хотя пример выглядит как объявление функции, на самом деле это - выражение, т.к. находится внутри другого выражения (блока оператора).
Второе: некоторые движки JavaScript (не считая SpiderMonkey) неправильно распознают выражения, считая их объявлением функции (IE в данном примере регистрирует функцию не смотря на ложное условие).
Этим объясняется поведение IE, выдающим false.
Остается найти "документальное" объяснение различного поведения FF (в принципе-то понятно):
Code (JavaScript): скопировать код в буфер обмена
alert((function() { 
  return function A() {
    A = null;
    return typeof A;
  }()
})())// FF -> function
alert((function() { 
  function A() {
    A = null;
    return typeof A;
  }
  return A()
})())// FF -> object
 
Но теперь уже не хочется решать, кто прав, а кто нет, т.к., к примеру, IE всегда может сослаться на то, что у них там свой "стандарт" (JScript, а не JavaScript).
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 12:03 pm (спустя 2 часа 26 минут; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Zeroglif
Что я "дурака свалял", написав:
Quote:
Остается найти "документальное" объяснение различного поведения FF...
Уже ведь все ссылки сам же и привел, и пояснил различное поведение при работе с объявлением и выражением функций. Сказывается двухдневное чтение на не родном языке, однако...
Короче, вот мой вердикт - FF действует в точности, как предписано E262-3.
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 2:19 pm (спустя 2 часа 16 минут; написано за 55 секунд)
   Post subject:
Reply with quote

AKS

Молодец! ЗачОт! Сам своими ногами прошёл тернистый путь от
Quote:
на мой взгляд "прав" IE
до
Quote:
FF действует в точности, как предписано E262-3
Как совершенно правильно было отмечено, функция может быть определена статически, как функция-объявление (FunctionDeclaration или для краткости FD) и динамически, как функция-выражение (FunctionExpression или FE). Для FE можно опустить идентификатор, он опционален. Но в том редком на практике случае, если идентификатор в FE всё же присутствует, отличить FE от FD сходу сложно, нужно смотреть на позицию функции в коде. Еcли функция стоит там, где в соотвествии с EcmaScript (ES) должно стоять выражение, то эта функция и есть выражение, то есть FE. Ниже пример, где из всех функций только последняя не является выражением.
Code (JavaScript): скопировать код в буфер обмена
  var a = function A(){};
  (function B(){});
  0, function C(){};
  [function D(){}];
  function F(){};
Разница между FD и FE особенна важна, когда мы говорим о механизме сбора всех идентификаторов в единый контейнер (Variable Object). Идентификатор FD должен попасть в этот контейнер, а идентификатор FE, наоборот, не должен. Об этом недвусмысленно говорится в ES 10.1.3, где речь идёт исключительно только о FD:
Quote:
"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..."
Причём вот это самое "попадание" в контейнер происходит до начала построчного сканирования кода в каждом отдельно взятом контексте исполнения (Execution Context). Что же касается FE, то их идентификаторы могут быть доступны только изнутри самого FE согласно ES 13, никакого влияния на внешнюю среду они не должны оказывать:
Quote:
"The Identifier in a FunctionExpression can be referenced from inside the FunctionExpression's FunctionBody to allow the function to call itself recursively. However, unlike in a FunctionDeclaration, the Identifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression."
Смотрим снова на пример:
Code (JavaScript): скопировать код в буфер обмена
  function (){
      return function A(){
          return [(A = 'function', typeof A), A != typeof B, function B(){B = null; return typeof B}()];
      }()
  }()
Для начала определим, чем являются функции A и B. Обе функции имеют идентификатор, поэтому сходу определить FD/FE не получится, нужно смотреть на позицию. Функция A стоит справа от ключевого слова return, на этом месте может быть только выражение (ES 12.9), значит A - это FE. Функция B стоит внутри инициализатора массива, является одним из его элементов. Элементом должно быть выражение (ES 11.1.4), значит и функция B - это FE. Таким образом, обе функции не объявлены (не FD), следовательно их имена не должны быть доступны снаружи.

Браузеры OP и FF корректно определили, что функции A и B являются FE, поэтому их идентификаторы доступны соответствующим функциям только изнутри, но не снаружи (typeof B == 'undefined'). IE, несмотря на то, что он, гад, понимает, что функции A и B являются FE (а иначе он бы не дал сделать вызов функциям) собирает их имена и даёт к ним доступ снаружи (typeof B == 'function'). IE делает так всегда, для всех функций с идентификатором.

Дальше интереснее. Почему FF единственный из всех не дал превратить A в строку, а B в null? Да потому что так написано в ES 13. На этапе создания FE идентификатор надо куда-то засунуть, а иначе как мы его найдем изнутри FE. Для этого специально для этой функции создаётся новый объект с одним единственным свойством ({}.имяфункции = функция) и он временно кладётся в scope chain контекста исполнения (если нужно пояснить про scope chain - свистните). Причем это единственное свойство нельзя перезаписать (аттрибут ReadOnly), чему собственно и следует FF, но не следует ни IE, ни OP.

Вывод:

IE - не прав;
OP - местами;
FF - прав;

p.s. Имхо (имховее не бывает) стоит вообще оставить только анонимные FE, запретив идентификатор.
p.s. Я могу ошибаться... ;-)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Sep 20, 2006 6:58 am (спустя 16 часов 38 минут; написано за 2 минуты 54 секунды)
   Post subject:
Reply with quote

Zeroglif
Quote:
...стоит вообще оставить только анонимные FE, запретив идентификатор.
А для чего вообще он нужен (идентификатор)? Понятно, что для рекурсивного вызова, но ведь есть arguments.callee? Или этот идентификатор остался просто "болтаться" без надобности с версии, предшествующей 1.2, в которой arguments.callee появился?
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Sep 20, 2006 9:05 am (спустя 2 часа 6 минут; написано за 4 минуты 27 секунд)
   Post subject:
Reply with quote

Как раз кстати (по-поводу IE - не прав; OP - местами; FF - прав;) хочу написать о мнении Дж. Фридла (Jeffrey Friedl), о котором только узнал из его книги, только там это относится к регвырам, но суть одна:
"...другие по своей прихоти изменяют стандартные правила (практически любой продукт от Microsoft). Третьи пытаются соблюдать стандарты, но оставляют «черные ходы» для своих целей."
Как-будто тоже подводил итог для этой темы (вот насколько ситуация одинакова в сфере разработки ПО) ;)
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 22, 2006 10:56 am (спустя 2 дня 1 час 51 минуту; написано за 4 минуты 46 секунд)
   Post subject:
Reply with quote

Иногда хорошо быть неправым узнаешь кучу интересного. Но есть один вопрос
Code (JavaScript): скопировать код в буфер обмена
if(bool){
    function a() {alert('0')}
}else{
    function a() {alert('1')}
}
a()
ИЕ всегда возвращает "1". Опера ведет себя так же как и ИЕ!!!.
А вот лиса ведет себя ожидаемо оба раза а это FD, если верить AKS (хотя знаю виноват надо самому сходить посмотреть стандарты), она в зависимости от bool выдает или 0 или 1. Но включаем режим strict и смотрим консоль.
Quote:
redeclaration of function a
    function a() {alert('1')}
Как же redeclaration если это FE?

Last edited by Андрей Сумин on Fri Sep 22, 2006 4:27 pm; edited 1 time in total
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Sep 22, 2006 1:11 pm (спустя 2 часа 14 минут; написано за 12 секунд)
   Post subject:
Reply with quote

FD (FunctionDeclaration) не может быть в блоке (ES 12.1), но и IE, и OP, и FF подошли к этому творчески. IE/OP как бы не замечают блок вовсе, декларируют функцию в обычном режиме, как если бы она лежала вне блока априори. Поэтому вполне объяснимо, почему в примере
Code (JavaScript): скопировать код в буфер обмена
if(true){
    function a() {alert('0')}
}else{
    function a() {alert('1')}
}
происходит ака "передекларация" функции без какой-либо реакции на блок и его условие (true/false), т.к. FD собираются в variable object на нулевой строке кода.

С FF веселее. С одной стороны он действует строго в рамках ES, считая функцию в блоке за выражение, то есть FE (FunctionExpression). Но, с другой стороны, он делает диаметрально противоположные вещи по отношению к этому выражению, доказывая, что это всё-таки не FE, а FD, т.к. нельзя поставить справа вызов, имя FE видно снаружи и становится свойством ближайшего variable object...

Почему так происходит можно только гадать. Мой вариант отгадки: внутри блока может быть только statement, то есть FD там не место, но expression statement не может начинаться с ключевого слова function, упс..., вырисовывается замкнутый круг. На выходе по уму надо бы выдавать ошибку, а FF типа взял и выкрутился, сделав как бы отложенную (по условию блока) декларацию функции.

И вообще именованная FE - это весчь слишком замысловатая для разных интерпретаторов, чтобы ею пользоваться безопасно. Надо отменять или выравнивать поведение. Все чудят по своему. FF создаёт спецобъект для хранения идентификатора (выше писал об этом), на втором вызове можно этот объект даже ручками поймать:
Code (JavaScript): скопировать код в буфер обмена
function A(){
    return function B(){return (this==window) ? B : this}()();
}

var O = A(); //
alert(O.B)   //
 
А IE/Opera этот объект не создают. Зато IE мрачно шутит, когда создаёт две независимые функции с одним и тем же телом и пр. так что на них можно вешать свои собственные свойства:
Code (JavaScript): скопировать код в буфер обмена
var A = function B(){alert(A == B)};
A(); // false в IE, а надо бы true (по логике ссылки на объект)
 
Чудны дела твои, J(ava)Script. ;-)
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Sep 22, 2006 2:46 pm (спустя 1 час 34 минуты; написано за 36 секунд)
   Post subject:
Reply with quote

Zeroglif
Code (JavaScript): скопировать код в буфер обмена
var O = A(); //
alert(O.B)   //
 
Что-то я не понял - откуда может взяться O.B?
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Sep 22, 2006 3:06 pm (спустя 20 минут; написано за 3 минуты 56 секунд)
   Post subject:
Reply with quote

Андрей Сумин
Quote:
если верить AKS
Это Вы об этом:
Code (JavaScript): скопировать код в буфер обмена
if (0)
   function zero() {
      document.writeln("This is zero.");
   }
?
Я-то тут не причем, ссылку на MDC я ведь выше привел. Но FF действительно ведет себя так, и не лезет в блок за FE. Я вот, кстати, так и не увидел в консоли "redeclaration of function a".
А Вас удивляет тот факт, что FF не понравилось переобъявление ("Как же redeclaration если это FD?")? Вообще, со стороны FF хорошее замечание, ведь она по сути дела предупреждает, что тут возможно нечаянным образом автор перепутал имена функций.
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Sep 22, 2006 3:22 pm (спустя 16 минут; написано за 15 секунд)
   Post subject:
Reply with quote

Андрей Сумин
Не внимательно прочел Ваше сообщение. Вы пишите, что a - это FD. Для FF - это выражение (FE).
Back to top
View user's profile Send private message Send e-mail
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 22, 2006 4:27 pm (спустя 1 час 4 минуты; написано за 4 секунды)
   Post subject:
Reply with quote

Опечатался исправил
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Sep 22, 2006 6:29 pm (спустя 2 часа 1 минуту; написано за 27 секунд)
   Post subject:
Reply with quote

AKS wrote:
Zeroglif
Code (JavaScript): скопировать код в буфер обмена
var O = A(); //
alert(O.B)   //
 
Что-то я не понял - откуда может взяться O.B?
В смысле у вас другой результат в FF? Или, как говорится, тема не раскрыта?
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Sep 22, 2006 6:51 pm (спустя 21 минуту; написано за 4 минуты 34 секунды)
   Post subject:
Reply with quote

Zeroglif
Все Gecko, какие есть с rv < 1.8 отдавали undefined, а вот последняя FF (rv 1.8.0.1) возвратила B. Уже потом, когда увидел результат последней (сначала-то глянул в старых), проследил за ходом выполнения и понял в чем фишка. Интересный у нее (FF 1.5) ход мысли...
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Sat Sep 23, 2006 7:18 am (спустя 12 часов 27 минут; написано за 9 минут 2 секунды)
   Post subject:
Reply with quote

Zeroglif
Code (JavaScript): скопировать код в буфер обмена
function A(){
    return function B(){return (alert(typeof this), B.b = !B.b) ? B : this}()();
}
var O = A(); // объект для хранения идентификатора FE
 
Сегодня решил продолжить "опыты". В условии заменил this==window для того, чтобы старые Gecko-бразы могли выдавать тоже, что и новые (у стареньких, глупеньких, при первом вызове this - это B???).
Так вот, в момент второго вызова this указывает на экземпляр Object. Куда же начинает смотреть this? Как бы то ни было, но this.constructor === function Object(){[native code]}. Что за объект? Неужели Activation/Variable object попался "под горячую руку" и ему пришлось смастерить экземплярчик? А иначе как среди свойств этого экземпляра может оказаться B?
Что думаете?
Back to top
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Sep 23, 2006 10:24 am (спустя 3 часа 5 минут; написано за 2 минуты 12 секунд)
   Post subject:
Reply with quote

Опять "погорячившись свалял дурака" - не может Activation/Variable object создать экземпляр - он ведь сам "экземпляр". Но за что же удается зацепиться this во втором вызове (что за объект, у которого в св-вах "валяется" B)?
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Sep 23, 2006 1:00 pm (спустя 2 часа 36 минут; написано за 2 минуты 25 секунд)
   Post subject:
Reply with quote

Quote:
Но за что же удается зацепиться this во втором вызове (что за объект, у которого в св-вах "валяется" B)?
Цитирую себя же:
Quote:
...так написано в ES 13. На этапе создания FE идентификатор надо куда-то засунуть, а иначе как мы его найдем изнутри FE. Для этого специально для этой функции создаётся новый объект с одним единственным свойством ({}.имяфункции = функция) и он временно кладётся в scope chain контекста исполнения (если нужно пояснить про scope chain - свистните)...
Щас буду ещё раз жечь своими словами. ;-) Предположим, у нас есть вложенные функции, обычные декларации (FD):
Code (JavaScript): скопировать код в буфер обмена
function A() {
    function B() {};
        function C() {};
}
Для того, чтобы из функции отыскать какой-либо идентификатор (любой), интерпретатор идёт своими интерпретаторскими ножками по всем Variable objects в цепочке Scope chain (прототип и всякие хитрости оставим за кадром). Для лучшего понимания визуально это можно представить себе в виде поиска определённого свойства среди одного из элементов условного массива:
Code (JavaScript): скопировать код в буфер обмена
//Scope chain для вызванной A - [A.V, G.V]
//Scope chain для вызванной B - [B.V, A.V, G.V]
//Scope chain для вызванной C - [C.V, B.V, A.V, G.V]
 
Где G - это Global object и где V - это Variable object, который нам не доступен кроме случаев с объектом Global, где он и является Variable object. !!!Очень важное замечание!!! - первый объект массива добавляется в массив в момент вызова функции, а все остальные в момент создания этой самой функции.

Допустим, мы превратим функцию B из FD в FE, возьмём её в скобки:
Code (JavaScript): скопировать код в буфер обмена
function A() {
    (function B() {});
        function C() {};
}
В этом случае идентификатор B в момент вызова функции B никак не cможет прицепиться к тому самому первому элементу массива (B.V), т.к. к Variable object цепляются только!!! вары/параметры/идентификаторы вложенных FD. Но и ко второму элементу массива (A.V) уже в момент создания функции идентификатор тоже не сможет прицепиться, т.к. тогда он станет доступен снаружи, из A, а это нам ну никак низзя. Значит, нужно в момент создания функции B придумать типа "проставочку" - некий отдельный специальный объект, в который и записать идентификатор. Визуально тогда новый пример будет выглядеть так:
Code (JavaScript): скопировать код в буфер обмена
//Scope chain для A - [A.V, G.V]
//Scope chain для B - [B.V, B.O, A.V, G.V]
//Scope chain для C - [C.V, B.V, A.V, G.V]
 
Теперь о this. В this всегда живёт объект, вызвавший функцию, caller, по-русски он же - Коля. ;-) Но возможны ситуации, когда или Коли условно говоря нет вообще (function(){alert(this)})() и тогда он становится равен null, или же Коля - есть не что иное, как сам Variable object, и тогда интерпретатор принудительно присваивает ему null (дескать негоже нам касаться своими грязными руками Variable object). Но null в caller-e - это не особенно полезно для дела, поэтому опять-таки принудительно null заменяется на глобальный объект (window в браузерах). Смотрим ещё раз на пример:
Code (JavaScript): скопировать код в буфер обмена
function A(){
    return function B(){return (this==window) ? B : this}()();
}

var O = A();
Первый раз вложенная функция B вызывается ака "литерально", нет никакого идентификатора слева от оператора вызова, Колю найти просто невозможно, поэтому он null, а раз null, то и this === window.

Второй раз при вызове на сцену уже выходит идентификатор B, значит надо найти, кому он принадлежит, а принадлежит он специальному объекту (а не Variable object), то есть по сути обычному объекту, автоматом создаваемому интерпретатором для определённых целей (для хранения ссылки на функцию B).

Вот как бы так.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Sep 23, 2006 4:04 pm (спустя 3 часа 3 минуты; написано за 52 секунды)
   Post subject:
Reply with quote

Zeroglif
Все, спасибо - "прозрел" и по этому вопросу! Именно - прозрел. Заглянул после Вашего последнего объяснения в очередной раз в спецификацию и в 13 Function Definition, там где "The production FunctionExpression : function Identifier...", пункт первый наконец-то стал ясен:
Quote:
1. Create a new object as if by the expression new Object().
А ведь читал, и не раз...
Замечание есть насчет "Коли". У меня во всех Gecko (20040113+) один результат: устанавливая alert(B.caller) в обе инструкции условного оператора получаю сначала A, потом B. Я это вот к чему - хочу поправить вот это:
Quote:
В this всегда живёт объект, вызвавший функцию, caller...
на следующее (Core JavaScript 1.5 Reference):
Quote:
caller - returns the function that invoked the specified function.
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Sep 23, 2006 4:30 pm (спустя 25 минут; написано за 3 минуты 46 секунд)
   Post subject:
Reply with quote

AKS wrote:
Zeroglif
Замечание есть насчет "Коли". У меня во всех Gecko (20040113+) один результат: устанавливая alert(B.caller) в обе инструкции условного оператора получаю сначала A, потом B. Я это вот к чему - хочу поправить вот это:
Quote:
В this всегда живёт объект, вызвавший функцию, caller...
на следующее (Core JavaScript 1.5 Reference):
Quote:
caller - returns the function that invoked the specified function.
Дружище, я не имел в виду местами уже умершее свойство caller, имелся в виду обычный термин, используемый в ES (ака объект - источник вызова, вызывающая сторона). Этот термин просто характеризует this при вызове.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Sat Sep 23, 2006 6:35 pm (спустя 2 часа 5 минут; написано за 1 минуту 46 секунд)
   Post subject:
Reply with quote

Quote:
имелся в виду обычный термин...
А-а-а, вот о чем тут речь... ;)
Back to top
View user's profile Send private message Send e-mail
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Fri Sep 29, 2006 8:53 pm (спустя 6 дней 2 часа 18 минут; написано за 8 минут 9 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Вывод:

IE - не прав;
OP - местами;
FF - прав;

p.s. Имхо (имховее не бывает) стоит вообще оставить только анонимные FE, запретив идентификатор.
p.s. Я могу ошибаться... ;-)
Я пришел к тому же выводу - прав FF.
Интересно, что к этому же выводу можно прийти другим путем:
Кто создал JS? Netscape. Которое фактически является подразделением Sun. Mozilla fundation хотя и некоммерческая организация, но на самом деле оружие Сана против Майкрософта. И разработчики там очень даже Нетскейповские. И весь движок JS мозиллы унаследован от того же нетскейпа. И спецификация языка фактически писалась исходя из этого движка/парсера. Следовательно, чей движок/парсер будет наиболее соответствующим спецификации?
Кстати, насчет "стоит вообще оставить только анонимные FE, запретив идентификатор" - именно так и поступили в ActionScript (я был сильно удивлен, случайно наткнувшись на это). Вообще интересно, что на данный момент лучшим продолжателем традиции JS является именно Флеш и родственные технологии (они уже давно реализовали типизированный язык и существенно оптимизировали интерпретатор/мусорщика по скорости).
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Sep 29, 2006 10:25 pm (спустя 1 час 32 минуты; написано за 17 секунд)
   Post subject:
Reply with quote

Quote:
Я пришел к тому же выводу - прав FF.
Интересно, что к этому же выводу можно прийти другим путем:
Кто создал JS?
Создал первоначально B.Eich со товарищами (часть из которых работала в Sun), но EcmaScript тогда и не пахло, серъезной угрозы MS (с IE) не представлял. И Microsoft, кстати, тоже можно было бы назвать создателем JS в некотором роде, т.к. свою технологию они всё-таки нарисовали, а не калькировали. Я бы сказал, что Java-lite/Mocha/LiveScript/JavaScript родился не как оружие против кого-то, а скорее, как мелкое тыловое инженерное подразделение, задачей котрого было обслуживать передовую (понтоны наводить, мостики стругать), где сражались Java + plugins + HTML...
Quote:
И весь движок JS мозиллы унаследован от того же нетскейпа. И спецификация языка фактически писалась исходя из этого движка/парсера. Следовательно, чей движок/парсер будет наиболее соответствующим спецификации?
Ну, не в тихую же писалось, обсуждали, решали группой, соответствие EcmaScript на разных этапах было разным, наследственность Netscape могла и мимо пролететь, это не показатель. Другой вопрос, что каждый выбрал своё. Если бы развитие IE не застопорилось на несколько лет подряд, мы могли бы иметь сейчас идеальную конформность EcmaScript в IE. Хотя и нынешняя вполне себе ничего...

p.s. Хотя к тесту этот разговор не слишком близок.
Back to top
View user's profile Send private message
DizzZ
Участник форума



Joined: 23 Jan 2006
Posts: 154
Карма: 8
   поощрить/наказать


PostPosted: Sat Sep 30, 2006 1:39 am (спустя 3 часа 13 минут; написано за 7 минут 29 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Ну, не в тихую же писалось, обсуждали, решали группой, соответствие EcmaScript на разных этапах было разным, наследственность Netscape могла и мимо пролететь, это не показатель. Другой вопрос, что каждый выбрал своё. Если бы развитие IE не застопорилось на несколько лет подряд, мы могли бы иметь сейчас идеальную конформность EcmaScript в IE. Хотя и нынешняя вполне себе ничего...

p.s. Хотя к тесту этот разговор не слишком близок.
К тесту этот пост действительно не очень близок и я за это заранее прошу прощения. Но уж больно тема интересная :)
Насчет соответствиия EcmaScript... Мне кажется, это достаточно смешной вопрос, поскольку стандарт EcmaScript создан на некотором этапе равзвития JavaScript и в виде практически полной копии JavaScript. Так что несоответствия JavaScript EcmaScript-у - это в некотором роде нонсенс: не могла родтельская технология не соответствовать дочерней, поскольку дочерняя строилась по ее образу и подобию.
Что же касается Майкрософтовцев... кроме того что они слизали язык полностью, они внесли в него некоторые "усовершенстовования", которые в конечном счете так и не прижились - условная компиляция, альтернативный синтаксис для событий и методов (из всех более менее на сегодняшний момент используется условная компиляция и из-за этого мне пришлось встроить ее поддержку в свой оптимизатор скриптов). Самое для меня странное - это что в стандарт так и не вошла конструкция switch/case/default.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Sep 30, 2006 3:47 pm (спустя 14 часов 7 минут; написано за 1 секунду)
   Post subject:
Reply with quote

Quote:
Мне кажется, это достаточно смешной вопрос, поскольку стандарт EcmaScript создан на некотором этапе равзвития JavaScript и в виде практически полной копии JavaScript.
Можно только утверждать, что JavaScript 1.1 был отправлен на стандартизацию, но ни он, ни его предшественник (1.0), ни потомок (1.2) не были конформны по-определению, а тем более не могли быть копией в связи с:

a) их рождением до выхода стандарта;
б) наличием пропиетарных барузерозависимых штучек-дрючек, имеющих непосредственное отношение к EcmaScript;
Quote:
Так что несоответствия JavaScript EcmaScript-у - это в некотором роде нонсенс: не могла родительская технология не соответствовать дочерней, поскольку дочерняя строилась по ее образу и подобию.
Не только по её образу и подобию. К моменту выхода стандарта (26.06.97) уже почти год существовал JScript (с 18.07.1996 официально под своим именем и приблизительно с зимы-весны 96г. в качестве ActiveXScript технологии). Всё это время Microsoft и др. (а не только Netscape) активно участвовали в работе группы, занимающейся стандартизацией и написанием EcmaScript, так что кто кому там был мама-папа уже не выяснить. Можно только говорить о JavaScript 1.1, как о базисе, из которого отсекали лишнее и к которому пришивали нужное.
Quote:
Что же касается Майкрософтовцев... кроме того что они слизали язык полностью
Я конечно свечку не держал, но совершенно с этим не согласен. Во-первых, если бы слизывали, то было бы действительно полностью, а получилось кусками, разная скорость работы парсера и т.п. Во-вторых, неоткуда было слизывать (Netscape тогда упорно отказывалась показывать доки и ещё не давала лицензий). В-третьих, тупое копирование просто не прижилось бы, MS сделали всё по-своему (ActiveX host и проч.). Я бы сказал так, что MS оценила, уловила и подхватила базовые принципы языка, самостоятельно их реализовала, сначала в качестве элементарной поддержки оригинального JavaScript-кода в своём браузере, а потом (когда стало ясно, что обратная совместимость версий JavaScript хреновата плюс получение лицензии не позволило бы вносить свои изменения) решили пойти параллельно. И всё это было сделано до стандартизации. Кстати, оригинальность языков признана в самом стандарте, чёрным по белому, с уважительным реверансом в сторону первооткрывателей.
Back to top
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Wed Oct 04, 2006 5:40 pm (спустя 4 дня 1 час 53 минуты; написано за 2 минуты 4 секунды)
   Post subject:
Reply with quote

Предлагаю отвлечься и поковырять теперь DOM. (andrewsumin.livejournal.com/6625.html)
Берем 2 елемента: DIV, INPUT. INPUT вложен в DIV. Ловим клик на инпуте меняем event и ловим клик на диве по баблингу.
Code (JavaScript): скопировать код в буфер обмена
var div = document.getElementById('div');
var button = document.getElementById('button');

function buttonclick(e){
    var evt = e || window.event;
    evt.changed = true;
}
addEvent('click', buttonclick, button);

function divclick(e){
    var evt = e || window.event;
    alert (evt.changed);
}
addEvent('click', divclick, div);


function addEvent(type, listener, obj) {
    if (obj.addEventListener){
        obj.addEventListener (type, listener, false);
    }else if (obj.attachEvent){
        obj.attachEvent ('on' + type, listener);
    }
}
Лиса и Опера выдают "true".
ИЕ выдаёт "undefined".
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 8:06 pm (спустя 2 часа 26 минут; написано за 4 минуты 16 секунд)
   Post subject:
Reply with quote

Андрей Сумин
Думаю, что описание объекта event (msdn.microsoft.com/library/default.aspurl=/workshop/author/dhtml/reference/objects/obj_event.asp) (для IE) может ответить на вопрос, именно:
Quote:
Several of the properties that apply to this object are not writable unless this object has been created using the createEventObject method.
Т.е., создав объект Event (document.createEventObject), ему можно добавить какие-либо св-ва, в противном случае добавить св-ва не получится (будут undefined)...
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Wed Oct 04, 2006 10:05 pm (спустя 1 час 58 минут; написано за 5 минут 26 секунд)
   Post subject:
Reply with quote

Объект event каждый раз свой собственный, заново создаваемый в IE, (скажем так, идентификатор event лично "принадлежит" обработчику и за его рамками в качестве именно такого вот идентификатора не виден). Можно проверить это, сохранив, например, event инпута в некой глобальной переменной, откуда он (и его свойства) будут легко доступны диву, а потом сравнив, event дива и эту переменную. Они будут ссылаться на разные объекты.

Добавлять свойства в event можно.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Oct 05, 2006 8:38 am (спустя 10 часов 33 минуты; написано за 5 минут 17 секунд)
   Post subject:
Reply with quote

Zeroglif
Вот как интересно получается! Действительно, разные объекты в текстовом поле и в блоке. А нет ли тут какой-нибудь ошибки с идентификаторами вроде той из вашего примера:
Code (JavaScript): скопировать код в буфер обмена
var A = function B(){alert(A == B)};
A(); //
 
?
И не было у меня повода раньше об этом задуматься - ведь пишут: "Событие всплывает...", к тому же можно прервать это всплытие (cancelBubble). Так что же за механизм? Если отменили распространение события - все, оно пропало, если не отменили - пошло дальше, но, дойдя до следующего элемента в иерархии документа, оно (экземпляр Event) заменяется другим?
Back to top
View user's profile Send private message Send e-mail
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Thu Oct 05, 2006 12:22 pm (спустя 3 часа 44 минуты; написано за 10 минут 30 секунд)
   Post subject:
Reply with quote

Zeroglif
Все же не укладывается у меня в голове мысль о том, что "event каждый раз свой собственный, заново создаваемый в IE...". Ведь сохраняются же значения "родных" свойств event при восхождении от элемента к элементу! Наверняка у них там с идентификаторами что-то не то, так же, как с функциями. Вот переделанный пример:
Code (JavaScript): скопировать код в буфер обмена
var A = function B(){ B.test = true; alert(A.test) };
A(); // везде, кроме IE - true, в IE - undefined
 
Думаю, все в точности и с идентификацией event. Я сделал примерчик, который показывает, что созданный "ручками" event позволяет устанавливать св-ва и менять их, как в документации:
Quote:
All properties of the event object created using createEventObject are read/write
При onload будет сэмулирован клик на текстовом поле и все будет OK - и event везде один и тот же, и св-во устанавливается, кликнув затем вручную можно увидеть, что значение нового св-ва не запоминается, но "родное" значение св-ва srcElement остается неизменным:
Code (html): скопировать код в буфер обмена
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
        "http://www.w3.org/TR/xhtml11/DTD/xhtml11-strict.dtd">

<html (december.com/html/4/element/html.html) xmlns='http://www.w3.org/1999/xhtml' xml:lang='ru'> (december.com/html/4/element/.html)
<head> (december.com/html/4/element/head.html)
<title> (december.com/html/4/element/title.html)</title>
<meta (december.com/html/4/element/meta.html) http-equiv='Content-Type' content='text/html; charset=windows-1251' /> (december.com/html/4/element/.html)
<script (december.com/html/4/element/script.html) type='text/javascript' charset='windows-1251'> (december.com/html/4/element/.html)
/*< (december.com/html/4/element/.html)![CDATA[*/
if(window.ActiveXObject) window.attachEvent('onload', function() {
  var button = document.getElementById('button');
  var div2 = document.getElementById('div2');
  var div1 = document.getElementById('div1');
  function button_click(e) {
    e.changed = true;
    alert([e.changed, e.srcElement.id]);
  }
  button.attachEvent('onclick', button_click);
  function div2_click(e) {
    alert([e.changed, e.srcElement.id]);
  }
  div2.attachEvent('onclick', div2_click);
  function div1_click(e) {
    alert([e.changed, e.srcElement.id]);
  }
  div1.attachEvent('onclick', div1_click);

  var ee = document.createEventObject();
  button.fireEvent('onclick', ee);

});
/*]]> (december.com/html/4/element/.html)
*/
</script>
</head>
<body> (december.com/html/4/element/body.html)
  <div (december.com/html/4/element/div.html) id='div1'> (december.com/html/4/element/.html)
    <div (december.com/html/4/element/div.html) id='div2'> (december.com/html/4/element/.html)
      <input (december.com/html/4/element/input.html) type='text' id='button' /> (december.com/html/4/element/.html)
    </div>
  </div>
</body>
</html>
Пока что могу сделать вывод такой - идентификаторы сами по себе, а вот всплывающий event все же должен быть один!
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Thu Oct 05, 2006 10:22 pm (спустя 9 часов 59 минут; написано за 17 секунд)
   Post subject:
Reply with quote

Quote:
А нет ли тут какой-нибудь ошибки с идентификаторами вроде той из вашего примера
Не думаю, что там ошибка, просто IE в случае с именованным FE (FunctionExpression) создаёт две функции, одну на нулевой строке кода (как обычную FD(FunctionDeclaration)), а другую в момент вычисления выражения. Такое вот своеобразное поведение.
Quote:
ведь пишут: "Событие всплывает...", к тому же можно прервать это всплытие (cancelBubble)
Так оно и всплывает, только это ведь не window.event. Событие - это... событие с присущими ему характеристиками, которые нам в момент рождения (генерации) события не известны. Оно рождается необработанным (unhandled) и тихо всплывает (bubble up) рекурсивно вверх по цепи родительских объектов до самого document в поисках того, кто ж его обработает напильником. А напильником его должен обработать любой(ые) зарегистрированный(ые) в цепи объектов обработчик(и) (handler). Увидев обработчик, событие наконец-то делает то, что в него заложено природой - срабатывает на объекте. Не на том объекте, где нашёлся обработчик, а на том, где родилось само событие (хотя эти объекты само собой могут совпадать). В этот самый момент мы получаем доступ непосредственно к событию и его характеристикам, создаётся специальный объект event object (ссылка на него помещается в window.event), этот объект хранит в себе определённые свойства события (srcElement, type и т.д.)...
Quote:
Если отменили распространение события - все, оно пропало, если не отменили - пошло дальше, но, дойдя до следующего элемента в иерархии документа, оно (экземпляр Event) заменяется другим?
Я себе фигурально представляю это так, что само событие всплывает и неизменно до самой своей смерти на поверхности (или при его отмене), но при его встрече с каждым новым обработчиком каждый раз создаются разные объекты с одним и тем же набором свойств, получаемых от события. Объекты разные. Более того, если рассматривать привязку через attachEvent, то первым аргументом в привязанную функцию приходит некий event object, который не равен window.event, но поля одинаковы, ещё одна несостыковка. Я это к тому веду, что механизм IE может и выдумывает различные схемы в разных ситуациях, создаёт туеву хучу объектов, главное - чтобы он давал нам возможность тронуть характеристики самого события.
Quote:
Ведь сохраняются же значения "родных" свойств event при восхождении от элемента к элементу!
Скорее не сохраняются, а копируются свойствами нового объекта event object.
Back to top
View user's profile Send private message
AKS
Участник форума



Joined: 28 Dec 2005
Posts: 1174
Карма: 102
   поощрить/наказать


PostPosted: Fri Oct 06, 2006 6:42 am (спустя 8 часов 20 минут; написано за 19 минут 21 секунду)
   Post subject:
Reply with quote

Zeroglif
Опять Вы меня подтолкнули к продолжению эксперимента:
Quote:
...если рассматривать привязку через attachEvent, то первым аргументом в привязанную функцию приходит некий event object, который не равен window.event, но поля одинаковы, ещё одна несостыковка.
Написав в каждом alert'е e == window.event можно наблюдать интересную картину - при генерации события "вручную" с помощью метода createEventObject() результат true, событие при "мышином" клике покажет false. Более того, отказавшись от привязки событий при помощи attachEvent, в обработчиках придется написать в самом начале e = window.event. И результаты такие же - в случае с объектом из createEventObject будет true, а при "ручном" клике - false.

Это еще один пример того, что за события, генерируемые браузером, "уцепиться" нельзя! По какой причине это происходит? То ли создаются несколько объектов, то ли у них там неразбериха с идентификаторами, то ли эта неразбериха как раз придумана для того, чтобы лишить нас возможности получить доступ к объекту события - это не главное, главное, что нет возможности для записи в этот объект. Точнее сказать - записать-то можно попытаться, но толку от этого никакого не будет, и ОНИ нас об этом предупреждали.

Тест я ведь специально выложил, чтобы показать, что объект события, созданный "вручную", не меняется от элемента к элементу - это проверяется предложенным вами способом сохранять ссылку на него в глобальной переменной. А вот реальный "мышиный" клик создает видимость того, что в каждом элементе создается новый объект, т.к. ссылки на этот объект ведут себя не предсказуемо. И в этом суть теста. Нужно решить - возможно ли такое, что поведение событий, по разному сгенерированных, может так отличаться, т.е. в одном случае имеем один объект, в другом - их куча?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Fri Oct 06, 2006 8:04 am (спустя 1 час 21 минуту; написано за 8 минут 28 секунд)
   Post subject:
Reply with quote

AKS
MSDN wrote:
All properties of the event object created using createEventObject are read/write, including those that would be read-only in Dynamic HTML (DHTML). This enables you to set properties on the event object from the HTML Component (HTC) file, before firing the event.
Источник: msdn.microsoft.com/workshop/components/htc/reference/methods/createeventobject.asp

Появился этот метод в IE вместе с behavior. Изначально, он предназначается для управления дополнительными типами событий в IE, т.к. стандартная событийная модель не поддерживает такую возможность.
К сожалению, на точке дискуссию на эту тему уже прибили...

Из этого можно сделать вывод, что существует 2 механизма управления событиями в IE:
* стандартный DHTML, растущий из первых IE
* дополнительный управляемый, растущий из Behavior

Отсюда же, растут ноги и у этой темы: IE передаёт ссылку на window.Event как параметр обработчику (xpoint.ru/forums/programming/javascript/crossbrowser/thread/31847.xhtml)
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Fri Oct 06, 2006 9:24 am (спустя 1 час 20 минут; написано за 5 минут 13 секунд)
   Post subject:
Reply with quote

Quote:
Это еще один пример того, что за события, генерируемые браузером, "уцепиться" нельзя! По какой причине это происходит? То ли создаются несколько объектов, то ли у них там неразбериха с идентификаторами, то ли эта неразбериха как раз придумана для того, чтобы лишить нас возможности получить доступ к объекту события - это не главное, главное, что нет возможности для записи в этот объект.
Да, по общей логике записать в событие ничего нельзя. Но лазейки оставили чисто функциональные, например, поле returnValue открыто для записи или keyCode, в изменённом виде они будут всплывать. В event Object можно писать всё.
Quote:
Нужно решить - возможно ли такое, что поведение событий, по разному сгенерированных, может так отличаться, т.е. в одном случае имеем один объект, в другом - их куча?
А без разницы, любой event Object, сколько бы их не было, обязан предоставить доступ к характеристикам самого события. IE это и делает. А событие одно.

OFF: К модерам - можно ли оторвать от этой темы кусок про события (задачка от А.Сумина) и выделить в отдельный топик? TIA
Back to top
View user's profile Send private message
Андрей Сумин
Участник форума



Joined: 23 Nov 2005
Posts: 60
Карма: 5
   поощрить/наказать

Location: Москва

PostPosted: Fri Oct 06, 2006 10:42 am (спустя 1 час 17 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

Продожаем експеримент.
Берем вешаем 2 обработчика на один объект и на одно и тоже событие.
Code (JavaScript): скопировать код в буфер обмена
var div = document.getElementById('div');
var button = document.getElementById('button');

function buttonclick1(e){
    var evt = e || window.event;
    window.status += (evt.changed ? '' : '' ) + ' ';
    evt.changed = true;
}

function buttonclick2(e){
    var evt = e || window.event;
    window.status += (evt.changed ? '' : '' ) + ' ';
    evt.changed = true;
}


addEvent('click', buttonclick1, button);
addEvent('click', buttonclick2, button);
ВСЕ три браузера написали "нет да". В пределах одного объекта разные обработчики делят один объект EVENT.

P.S. Оказывается в ИЕ можно на один обект, на одно и тоже событие 2 раза повесить один и тот же обработчик (buttonclick1 например), а в опере и лисе нельзя нужно создавать 2 разных.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML