Jump to content
  • 0

Чередующиеся строки в таблице


Vlad
 Share

Question

Написал небольшой скрипт, который в любой таблице поочередно меняет цвет строки: светлая, темная, светлая, темная...

Посмотрите на предмет правильности описания и возможных ошибок.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Чередующиеся строки</title>
<script type="text/javascript">
zebraTable = function() {

// Получаем массив всех таблиц на странице
tables = document.getElementsByTagName("table");

// Пробегаемся по массиву таблиц
for (i = 0; i < tables.length; i++) {

// Если у таблицы стоит class="zebra", то делаем чередующиеся строки
if (tables[i].className == "zebra") {

// Получаем массив всех строк в нужной таблице
tr = document.getElementsByTagName("tr");

// Пробегаемся по всем строкам таблицы
for (j = 0; j < tr.length; j++) {

// Для нечетных строк устанавливаем class="odd"
if (j%2) tr[j].className = "odd";
}
}
}
}
window.onload = zebraTable;
</script>
<style type="text/css">
table.zebra {
width: 100%; /* Ширина таблицы */
border-collapse: collapse; /* Убираем двойные линии между ячеек */
}

table.zebra td {
padding: 4px; /* Поля в ячейках */
border: 1px solid #666; /* Граница между ячеек */
}

table.zebra thead {
background: #fc0; /* Цвет фона заголовка */
}

table.zebra tbody tr {
background: #f0f0f0; /* Цвет фона четных строк */
}
table.zebra tbody tr.odd {
background: #ccc; /* Цвет фона нечетных строк */
}
</style>
</head>
<body>
<table class="zebra">
<thead>
<tr><td>Место</td><td>Оценка</td><td>Фильм</td><td>Год выпуска</td></tr>
</thead>
<tbody>
<tr><td>1</td><td>9.1</td><td>Крестный отец</td><td>1072</td></tr>
<tr><td>2</td><td>9.1</td><td>Побег из Шоушенка</td><td>1994</td></tr>
<tr><td>3</td><td>9.0</td><td>Крестный отец 2</td><td>1974</td></tr>
<tr><td>4</td><td>8.9</td><td>Хороший, плохой, злой</td><td>1966</td></tr>
<tr><td>5</td><td>8.8</td><td>Криминальное чтиво</td><td>1994</td></tr>
<tr><td>6</td><td>8.8</td><td>Список Шиндлера</td><td>1993</td></tr>
<tr><td>7</td><td>8.8</td><td>Звездные войны: эпизод 5</td><td>1980</td></tr>
<tr><td>8</td><td>8.8</td><td>Полет над гнездом кукушки</td><td>1975</td></tr>
<tr><td>9</td><td>8.8</td><td>Касабланка</td><td>1942</td></tr>
<tr><td>10</td><td>8.8</td><td>Семь самураев</td><td>1954</td></tr>
</tbody>
</table>
</body>
</html>

Link to comment
Share on other sites

  • Answers 57
  • Created
  • Last Reply

Top Posters For This Question

Top Posters For This Question

Recommended Posts

  • 0
... Если бы было var, то это быда бы декларация переменной.

Вот это и есть ключевой момент.

То, что происходит в случае "Если бы было var", всем хорошо понятно, и этому есть объяснение в спецификации. Но что происходит в случае, когда "не было var"? Есть ли в спецификации описание такого синтаксиса? А может быть это bug или extension ES3 синтаксиса? Попадет ли подобное в разряд семантических ошибок в будущих реализациях ES:

Proposed ECMAScript 4th Edition ? Language Overview

VIII. Verification

...the strict mode also statically detects and rejects certain programming errors common in ES3 programs (e.g. calling functions with the wrong number of arguments and assigning to nonexistent variables).

Link to comment
Share on other sites

  • 0
Но что происходит в случае, когда "не было var"? Есть ли в спецификации описание такого синтаксиса? А может быть это bug или extension ES3 синтаксиса? Попадет ли подобное в разряд семантических ошибок в будущих реализациях ES:

В спецификации есть описание присвоения.

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

Так как парсер обязан вернуть ссылку на объект, который он не нашел в списке переменных данной области видимости (scope chain), то он, по идее, должен все равно его создать, присвоить имя идентификатора и указать тип Undefined.

Вот есть вопрос на размышление, что должен вернуть код

alert( x );

если x никогда до этого не был указан.

Link to comment
Share on other sites

  • 0
Так как парсер обязан вернуть ссылку на объект, который он не нашел в списке переменных данной области видимости (scope chain), то он, по идее, должен все равно его создать, присвоить имя идентификатора и указать тип Undefined.

Где можно прочесть об этом алгоритме?

Link to comment
Share on other sites

  • 0

s0rr0w, хорошо, с этим разобрались.

А теперь сделайте вывод - это все же bug, под который подогнали документацию, или что-то еще? Будет ли это исправлено в будущем, или в спецификации появится специальный раздел "Аssignment to undeclared variable"?

Вывод можно сделать на основе рекомендаций, которые можно прочесть на сайтах разработчиков:

Declaring Variables:

You can declare a variable in two ways:

* With the keyword var. For example, var x = 42. This syntax can be used to declare both local and global variables.

* By simply assigning it a value. For example, x = 42. This always declares a global variable and generates a strict JavaScript warning. You shouldn't use this variant.

Declaring JScript Variables and Constants:

Note

Declaring variables without the var keyword generates a compile-time error when running in fast mode, the default mode for JScript.

Кстати, прочтите о том, что на самом деле происходит, к примеру, в JScript в подобных случаях (должно помочь при оценке "валидности" подобных конструкций):

Eric Lippert:

* First we search the scope chain ? with blocks, the activation frame, the globals ? for any object that has a property y. We do not find one.

* Next we search all the global host objects asking them if they have a property y. We do not find one.

* Therefore we create a special "fake" address and put it on the script stack. This completes the first part of the binding.

* Determining the value is trivial in this case.

* When we do the store we detect that there's a fake address on the stack, allocate a new global variable in the script engine's global name table, and replace the fake address with this new real address.

* Finally, we invoke the property put logic in the global name table to store the value to the correct address.

Link to comment
Share on other sites

  • 0
А теперь сделайте вывод - это все же bug, под который подогнали документацию, или что-то еще? Будет ли это исправлено в будущем, или в спецификации появится специальный раздел "Аssignment to undeclared variable"?

Это не баг, это фича языка. Все переменные являются объектами, результат, который возвращает парсер, должен быть объектом. Чтобы вернуть объект, надо его создать.

Link to comment
Share on other sites

  • 0
Все переменные являются объектами, результат, который возвращает парсер, должен быть объектом. Чтобы вернуть объект, надо его создать.

В очередной раз показываете то, что у Вас совершенно неверное представление о происходящем!

11.1.2 Identifier Reference

...

The result of evaluating an Identifier is always a value of type Reference.

При этом reference варьируется в зависимости от типа данных.

JScript:

Numbers and Boolean values (true and false) are copied, passed, and compared by value. When you copy or pass by value, you allocate a space in computer memory and copy the value of the original into it...

Objects, arrays, and functions are copied, passed, and compared by reference. When you copy or pass by reference, you essentially create a pointer to the original item, and use the pointer as if it were a copy. If you then change the original, you change both the original and the copy (and vice versa)...

Это не баг, это фича языка.

Если Вы считаете, что assignment to undeclared variable ? это фича, а не аномалия, подобная недоразумениям, вроде:

1. Оператор typeof возвращает "object" для операндов null value и Array object;

2. Значением [[Prototype]] property для arguments object является Object.prototype, а не Array.prototype (мне известно, что лишь Opera реализовала это логичным образом).

3. Значением [[Class]] property для RegExp.prototype, как утверждает спецификация, является "Object" (хотя эксперимент говорит об обратном: Object.prototype.toString.call(RegExp.prototype) -> object RegExp(Prototype) ).

, а также другим недоработкам в языке, относящиеся к оператору with, функции eval, this value, идентификаторам FunctionExpression и проч. - это ваше право.

Если Вы уверены, что в будущем assignment (как сейчас reference) to undeclared variable, не станет illegal ? пусть будет так.

Если Вы не желаете обращать внимания на недвусмысленные намеки тех, кто занимается разработкой будущих версий языка:

Proposed ECMAScript 4th Edition ? Language Overview:

VII. Behavior

...it will break some existing content but will in general be an improvement.

- как Вам угодно. Только потом не кусайте локти, когда на ваши претензии Вы получите ответ, вроде: "Не надо было пренебрегать рекомендациями касательно good/bad practice".

Но, тем не менее, я попытаюсь "достучаться" в последний раз. Давайте посмотрим на проблему с другой стороны. Вы сами указали на алгоритм, который я теперь буду сравнивать с алгоритмом объявления функции. Замечу, что речь идет даже не о FunctionDeclaration vs VariableDeclaration, а о FunctionDeclaration vs Assignment to undeclared variable.

При этом, если бы стоял вопрос о том, как создать объект-функцию, которая должна быть видна в любой области программы, используя объявление функции или используя присвоение объявленной переменной, ответ, в принципе, можно было бы обнаружить на поверхности. Нет ни логических, ни синтаксических, ни каких-либо других предпосылок для использования присвоения переменной значения объекта-функции, т.к. в данном случае нет ни условий, ни любых других структурных вариаций. Следовательно вывод прост ? если нужен объект-функция, то нужно просто создать этот объект, используя простой и понятный синтаксис FunctionDeclaration (о нем ? ниже).

Вы же стоите за синтаксис, в котором отсутствует объявление переменной, поэтому показать то, насколько громоздок и неуклюж подобный алгоритм, будет довольно просто (еще наглядней, чем в случае с VariableDeclaration, о котором я не пишу ? придется поверить мне на слово).

Я не буду включать в описание того и другого метода идентификации функции непосредственно этапы созданиея объекта-функции, т.к. это один и тот же процесс (13.2 Creating Function Objects).

Итак, вот что должно произойти при вычислении такой строки function zebra () {}; (предложил WingedFox):

1. Create a new Function object as specified in section 13.2 with parameters specified by FormalParameterList, and body specified by FunctionBody. Pass in the scope chain of the running execution context as the Scope.

2. Create a property of the current variable object (as specified in section 10.1.3) with name Identifier and value Result(1).

Все предельно ясно и просто.

А вот что должно произойти при вычислении такой строки zebra = function () {}; (предложили Вы):

1. Evaluate LeftHandSideExpression.

1. Get the next object in the scope chain. If there isn't one, go to step 5.

2. Call the [[HasProperty]] method of Result(1), passing the Identifier as the property.

[[HasProperty]]:

1. If O has a property with name P, return true.

2. If the [[Prototype]] of O is null, return false.

3. Call the [[HasProperty]] method of [[Prototype]] with property name P.

4. Return Result(3).

3. If Result(2) is true, return a value of type Reference whose base object is Result(1) and whose property name is the Identifier.

4. Go to step 1.

5. Return a value of type Reference whose base object is null and whose property name is the Identifier.

2. Evaluate AssignmentExpression.

1. Create a new Function object as specified in section 13.2 with parameters specified by FormalParameterListopt and body specified by FunctionBody. Pass in the scope chain of the running execution context as the Scope.

2. Return Result(2).

3. Call GetValue(Result(2)).

1. If Type(V) is not Reference, return V.

2. Call GetBase(V).

GetBase(V):

Returns the base object component of the reference V.

3. If Result(2) is null, throw a ReferenceError exception.

4. Call the [[Get]] method of Result(2), passing GetPropertyName(V) for the property name.

[[Get]]:

1. If O doesn?t have a property with name P, go to step 4.

2. Get the value of the property.

3. Return Result(2).

4. If the [[Prototype]] of O is null, return undefined.

5. Call the [[Get]] method of [[Prototype]] with property name P.

6. Return Result(5).

GetPropertyName(V):

Returns the property name component of the reference V.

5. Return Result(4).

4. Call PutValue(Result(1), Result(3)).

1. If Type(V) is not Reference, throw a ReferenceError exception.

2. Call GetBase(V).

GetBase(V):

Returns the base object component of the reference V.

3. If Result(2) is null, go to step 6.

4. Call the [[Put]] method of Result(2), passing GetPropertyName(V) for the property name and W for the value.

[[Put]]:

1. Call the [[CanPut]] method of O with name P.

2. If Result(1) is false, return.

3. If O doesn?t have a property with name P, go to step 6.

4. Set the value of the property to V. The attributes of the property are not changed.

5. Return.

6. Create a property with name P, set its value to V and give it empty attributes.

7. Return.

GetPropertyName(V):

Returns the property name component of the reference V.

5. Return.

6. Call the [[Put]] method for the global object, passing GetPropertyName(V) for the property name and W for the value.

7. Return.

4. Return Result(3).

Если после подобного сравнения Вы будете по прежнему настаивать, что "Нет особой разницы. Оба варианта нормальные", то я уже ничего не смогу добавить. Я лишь тихо прошепчу себе под нос: "Горбатого могила исправит".

Вот, кстати, ответ на ваш "вопрос на размышление, что должен вернуть код". У моего примера, конечно, мало общего с обсуждаемыми вопросами, но все же:

(function x() {
x = y = function y() {};
}());

alert([typeof x, typeof y]); // -> IE: "function,undefined", FF: "undefined,function"

А вот пример того, как исчезает ваша zebra, хотя ее, как будто никто не "трогает" (будь у нее var - не исчезла бы):

zebra = function () {};

(function (o) {
with (o) {
while (typeof zebra != 'undefined') {
if (!delete zebra) {
break;
};
};
};
}({ zebra: 2 }));

alert(typeof zebra);

Примеры расчитаны на то, чтобы убавить желание использовать необъявленные переменные.

Link to comment
Share on other sites

  • 0

to all competitors :)

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

Link to comment
Share on other sites

  • 0
В очередной раз показываете то, что у Вас совершенно неверное представление о происходящем!

Стоило пропустить слово референс, как тут-же слышу вопли про неверное представление. Да возвращается ссылка на значение. Но на значение созданной переменной.

Если Вы считаете, что assignment to undeclared variable ? это фича, а не аномалия, подобная недоразумениям, вроде:

Это фича языка. Все действия не противоречат логике работы интерпретатора.

Если Вы уверены, что в будущем assignment (как сейчас reference) to undeclared variable, не станет illegal ? пусть будет так.

Может и не стать.

Если Вы не желаете обращать внимания на недвусмысленные намеки тех, кто занимается разработкой будущих версий языка...

Кто вам сказал, что я не обращаю внимания?

Нет ни логических, ни синтаксических, ни каких-либо других предпосылок для использования присвоения переменной значения объекта-функции, т.к. в данном случае нет ни условий, ни любых других структурных вариаций. Следовательно вывод прост ? если нужен объект-функция, то нужно просто создать этот объект, используя простой и понятный синтаксис FunctionDeclaration (о нем ? ниже).

Не надо пытаться привести обоснование действий на основе вырожденных вариантов применения скрипта. Если смотреть глобальнее, то не всегда FunctionDeclaration приносит позитив.

Например

function x () { alert("Do something once"); };
x();

function x () { alert("Stop") };
x ();

в обоих случаях будет два алерта "Stop";

А вот в этом случае

function x () { alert("Do something once"); };
x();

var x = function() { alert("Stop") };
x ();

Будет выведено два разных алерта. Надо ли пояснять практический смысл данного примера?

Если после подобного сравнения Вы будете по прежнему настаивать, что "Нет особой разницы. Оба варианта нормальные", то я уже ничего не смогу добавить. Я лишь тихо прошепчу себе под нос: "Горбатого могила исправит".

С точки зрения получения результата - нет разницы. Вы просто не сможете доказать, что один из вариантов лучше, и только его надо обязательно использовать. Любой из вариантов создания функции имеет свои плюсы и минусы, зная их, можно более гибко строить работу скрипта.

Примеры расчитаны на то, чтобы убавить желание использовать необъявленные переменные.

Практическое применение вашего чудо-кода есть? Или это только вырожденные варианты, которые встречаются в реальных кодах в одном случае из миллиона?

Link to comment
Share on other sites

  • 0
Стоило пропустить слово референс, как тут-же слышу вопли про неверное представление.

Еще бы написали: "Стоило один раз ошибиться!" - хоть посмеялись бы.

Надо ли пояснять практический смысл данного примера?

Поясните.

С точки зрения получения результата - нет разницы.

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

Что ж, поскольку Вы этой разницы так и не признали, то я, как и обещал, щепчу себе под нос: "Горбатого могила исправит".

Вы просто не сможете доказать, что один из вариантов лучше, и только его надо обязательно использовать.

Я привел конкретный пример! Описание двух вариантов говорит само за себя, и каждый вменяемый человек поймет то, какой из вариантов лучше. Доказывать уже нечего.

Любой из вариантов создания функции имеет свои плюсы и минусы, зная их, можно более гибко строить работу скрипта.

Расскажите о том, какие выгоды несет ваш вариант zebra = function () {}; в данном контексте (что за ним стоит, кроме вашего упрямства).

Link to comment
Share on other sites

  • 0
Еще бы написали: "Стоило один раз ошибиться!" - хоть посмеялись бы.

Да даже и ошибиться, не вижу в этом ничего позорного.

Поясните.

Я думал, что пример говорит сам за себя.

Итак, у вас есть некий cgi-модуль, который динамически формирует определенный JS в зависимости от контекста. Кусок JS кода передается модулю как параметр из других модулей. Порядок добавления кода может быть разным. Вам нужно производить инициализацию некого объекта только один раз, самым первым модулем, который был в стеке. Факт инициализации можно записывать в флаге, а можно сделать следующим образом

Глобальная функция инициализации

function init () {

code...

};

модуль 3

init();

var init= function(){};

модуль 1

init();

var init= function(){};

модуль 2

init();

var init= function(){};

В данном случае гарантировано будет исполнена функция инициализации всего один раз.

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

Да мне лично пофиг, что кто-то не может воспринять мой код.

Что ж, поскольку Вы этой разницы так и не признали, то я, как и обещал, щепчу себе под нос: "Горбатого могила исправит".

Простите, но я в курсе, какая разница. Я не признаю зашоренного ограничения сознания всего одним вариантом. Никогда еще ограниченность не делала решения шедевральными.

Я привел конкретный пример! Описание двух вариантов говорит само за себя, и каждый вменяемый человек поймет то, какой из вариантов лучше. Доказывать уже нечего.

Как я уже и говорил, нормального и взвешенного доказательства не будет. Описание говорить может, но из него не вытекает однозначность выбора.

Расскажите о том, какие выгоды несет ваш вариант zebra = function () {}; в данном контексте (что за ним стоит, кроме вашего упрямства).

То, что переменная объявляется в глобальном контексте. Пример Влада, как я уже говорил, вырожден, и не может служить примером идеального решения. Код может использоваться в любом месте, с любыми начальными данными, со всевозможными отклонениями. Код не идеален сам по себе и, даже с исправлениями, решает только самые примитивные задачи.

Link to comment
Share on other sites

  • 0
Да даже и ошибиться, не вижу в этом ничего позорного.

Я тоже не вижу ничего подобного. Плохо то, что Вы, плутая в трех соснах, оспариваете good practice, сформированную на лучшем, что есть в мировом опыте.

На xpoint.ru я видел замечательный лозунг, который звучал примерно таким образом: "Неверный, но авторитетно звучащий ответ, хуже, чем отсутствие ответа".

В данном случае гарантировано будет исполнена функция инициализации всего один раз.

В данном случае налицо грубейшие ошибки дизайна программы. Кстати, это еще один показательный пример того, как ваши пространные рассказы о вашем пресловутом опыте рушатся, как карточные домики, стоит Вам показать себя "в деле".

Да мне лично пофиг, что кто-то не может воспринять мой код.

А дело не в том, что кто-то не воспринимает ваш код (всем тоже пофигу ваш код). Дело в том, что Вы афишируете подобный трешевый стиль, навязывая свое мнение, вместо того, чтобы делать выводы и исправляться.

Я не признаю зашоренного ограничения сознания всего одним вариантом. Никогда еще ограниченность не делала решения шедевральными.

...

Как я уже и говорил, нормального и взвешенного доказательства не будет. Описание говорить может, но из него не вытекает однозначность выбора.

Я тоже уже говорил, что общение с Вами - бесполезное занятие.

А выбор должен быть продиктован конкретными условиями. Я все объяснил. Как я уже писал, Вы или слепы, ли глупы. У Вас перед носом два алгоритма. Один состоит из двух пунктов, второй - из нескольких десятков. Ваш выбор в пользу второго - это еще одно свидетельство вашей безграмотности в подобных вопросах.

То, что переменная объявляется в глобальном контексте.

Да не объявляется никакая переменная в глобальном контексте! Создается св-во глобального объекта, отличающееся от переменных хотя бы тем, что не имеет атрибута { DontDelete }. И вся проблема в том, как это св-во создается (уже объяснял, но Вам хоть кол на голове теши)!

Richard Cornford:

...it is good practice to never use an Identifier that refers to a property of the global object without first declaring that Identifier as a global variable. This 'best practice' helps to avoid and identify scripting errors as it becomes obvious which Identifiers are intended to refer to global variables, and which may just be leaking out of their intended scope. It also avoids naming collision issues with properties of the global object created by IE to represent DOM Elements that have ID attributes, and are resistant to assignment in their natural state.

Link to comment
Share on other sites

  • 0
Плохо то, что Вы, плутая в трех соснах, оспариваете good practice, сформированную на лучшем, что есть в мировом опыте.

Вам придется сильно постараться, чтобы доказать мне, что я действительно путаюсь в трех соснах. Если бы вы внимательно читали спецификацию, то у вас не было бы утверждения, что нет ни одного способа идентификации функции вида zebra = function (){}; И, тем более, вам придется серьезно постараться, чтобы доказать, что я действительно оспариваю good practice. Я всего лишь указываю на то, что нужно не слепо верить, а думать над теми вещами, которые происходят.

В данном случае налицо грубейшие ошибки дизайна программы. Кстати, это еще один показательный пример того, как ваши пространные рассказы о вашем пресловутом опыте рушатся, как карточные домики, стоит Вам показать себя "в деле".

Дизайн программы? Это смешно! Когда над одним кодом могут работать разные люди разной квалификации, с разным пониманием языка, то ни о каком дизайне обычно не идет речь. И прежде чем показывать на меня пальцем, советую приводить свои варианты решения. Чтобы не было голословных заявлений.

Я тоже уже говорил, что общение с Вами - бесполезное занятие.

Общение со мной бесполезное занятие, если мне пытаются бездоказательно что-либо рассказать. Я люблю аргументированные споры, а не надувание щек. Я просил доказательства - их нет. Есть всего лишь заявления, что я либо слеп, либо глуп.

А выбор должен быть продиктован конкретными условиями. Я все объяснил. Как я уже писал, Вы или слепы, ли глупы. У Вас перед носом два алгоритма. Один состоит из двух пунктов, второй - из нескольких десятков. Ваш выбор в пользу второго - это еще одно свидетельство вашей безграмотности в подобных вопросах.

Отличное утверждение! Не зная условий, в которых будет использоваться данный скрипт, как вы пришли к выводу, что нужно использовать только ОДИН вариант декларации функции, и никаких других быть не должно?

Да не объявляется никакая переменная в глобальном контексте! Создается св-во глобального объекта, отличающееся от переменных хотя бы тем, что не имеет атрибута { DontDelete }. И вся проблема в том, как это св-во создается (уже объяснял, но Вам хоть кол на голове теши)!

Простите, а как по-русски будет Variable declaration? Уж не объявление ли переменной?

И является ли создание идентифицированного свойства объекта объявлением переменной?

Откуда такие придирательства к словам, которые четко отражают суть?

Как вы считаете, проходит ли алгоритм декларации переменной пункт 8.6.2.2 спецификации?

Все переменные в ES ялвяются свойствами, хотя и со своими ньюансами. На что вы мне хотели открыть глаза? Я не понимаю.

Link to comment
Share on other sites

  • 0
Вам придется сильно постараться' date=' чтобы доказать мне, что я действительно путаюсь в трех соснах.[/quote']

Да мне не нужно стараться, Вы это делаете за меня. Вот ваши "крылатые фразы":

в какую chain scope попадут нижеследущие переменные

zebra = function () {};. написано в пункте 10.1.1

нужно scope chain... По русски это звучит как "область видимости"

Так как парсер обязан вернуть ссылку на объект .. должен все равно его создать, присвоить имя идентификатора и указать тип Undefined.

Все переменные являются объектами, результат, который возвращает парсер, должен быть объектом. Чтобы вернуть объект, надо его создать.

Если бы вы внимательно читали спецификацию' date=' то у вас не было бы утверждения, что нет ни одного способа идентификации функции вида zebra = function (){};[/quote']

А я этого не утверждал. Я лишь поводил Вас "за ручку" по докам, чтобы Вы сами показали, что это ни FunctionDeclaration, ни VariableDeclaration - это присвоение неквалифицированной переменной. Потом я Вам показал, насколько этот алгоритм плох. Лично для себя я это давным-давно выяснил.

Я всего лишь указываю на то' date=' что нужно не слепо верить, а думать над теми вещами, которые происходят.[/quote']

Ну так подумайте, если получится, о том, чем Вы тут занимаетесь.

Дизайн программы? Это смешно!

Смешны Вы' date=' ваши заявления и ваши фрагменты кода.

И прежде чем показывать на меня пальцем' date=' советую приводить свои варианты решения. Чтобы не было голословных заявлений.[/quote']

Все заявления закрепляю цитатами и ссылками.

Я просил доказательства - их нет.

Ну вот' date=' я же писал, что Вы слепы.

Не зная условий' date=' в которых будет использоваться данный скрипт, как вы пришли к выводу, что нужно использовать только ОДИН вариант декларации функции, и никаких других быть не должно?[/quote']

Пытаетесь "прикрыть зад" какими-то вымышленными условиями? Ну-ну.

Простите' date=' а как по-русски будет Variable declaration? Уж не объявление ли переменной?[/quote']

Так оно и есть. Только в вашем случае (zebra = function () {};) нет никакого объявления переменной.

Как вы считаете' date=' проходит ли алгоритм декларации переменной пункт 8.6.2.2 спецификации?[/quote']

Нет, этот алгоритм не используется.

На что вы мне хотели открыть глаза? Я не понимаю.

Да я вижу, что Вы ни черта не понимаете. Зачем Вы мне об этом напоминаете?

Link to comment
Share on other sites

  • 0

Поскипал часть "обсуждения". Можно было бы дальше спорить, но это уже оффтопик.

Простите, а как по-русски будет Variable declaration? Уж не объявление ли переменной?

Так оно и есть. Только в вашем случае (zebra = function () {};) нет никакого объявления переменной.

На остальные вопросы принципиально не отвечаете? Процесс создания именованного свойства объекта можно называть объявлением переменной?

Почему объявление переменной - это создание свойства объекта, а создание свойства объекта - не создание переменной.

Нет, этот алгоритм не используется.

Используется :)

Да я вижу, что Вы ни черта не понимаете.

:( Спасибо, что мне напомнили.

Знаете чем отличаются автомеханики от гонщиков? Одни знают все про машину, но эти знания не дают им шансов выиграть гонку. Вторые просто ездят, и достигают результатов.

Link to comment
Share on other sites

  • 0
На остальные вопросы принципиально не отвечаете?

Будут интересные вопросы (с точки зрения здравого смысла) - появятся и ответы.

Процесс создания именованного свойства объекта можно называть объявлением переменной?

Вы о каких объектах речь ведете?

Почему объявление переменной - это создание свойства объекта, а создание свойства объекта - не создание переменной.

Разные алгоритмы - я ведь объяснял, а Вам, как о стену горох!

Используется :)

Вы же призываете: "Чтобы не было голословных заявлений". Так что доказывайте, ведь Вы должны опровергнуть мое утверждение. Посмотрите, как это делаю я - что-то цитирую, на что-то ссылаюсь. И пусть Вам потребуется еще одна неделя, как в случае с алгоритмом zebra = function () {}; - ничего, не волнуйтесь, торопиться некуда.

Link to comment
Share on other sites

  • 0
Большое спасибо за интересный спор. :)

Рад стараться. Пишу-то для всех, а для этого "гонщика", который заявляет о себе, что он "ездит, и достигает результатов", в отличие от тех, у кого нет шансов. :(

Link to comment
Share on other sites

  • 0
Вы о каких объектах речь ведете?

К примеру, глобальном объекте.

Разные алгоритмы - я ведь объяснял, а Вам, как о стену горох!

Т.е., одно от другого вы отличаете сугубо по алгоритмам?

Вот мне интересно, а чем у вас свойство отличается от переменной? Приведите общее описание, абстрагируясь от алгоритма работы интерпретатора.

Вы же призываете: "Чтобы не было голословных заявлений". Так что доказывайте, ведь Вы должны опровергнуть мое утверждение. Посмотрите, как это делаю я - что-то цитирую, на что-то ссылаюсь.

Так вы внимательно читайте спеки. Вы же у нас знающий, а не я.

12.2 Variable statement

При наличии AssignmentExpression, интерпретатор всегда проходит пункт 8.6.2.2 [[Put]] (P, V)

Link to comment
Share on other sites

  • 0
К примеру, глобальном объекте.

Вас вводит в заблуждение тот факт, что global object одновременно используется и как variable object? Так ведь Вас предупреждали, что он особенный, уникальный:

10.1.5 Global Object

There is a unique global object (section 15.1), which is created before control enters any execution context.

10.2.1 Global Code

Variable instantiation is performed using the global object as the variable object and using property attributes { DontDelete }.

Т.е., одно от другого вы отличаете сугубо по алгоритмам?

Есть еще, к примеру, Variable statement (п. 12.2), и понятный синтаксис (не всем, конечно, он понятен, но надо пытаться):

VariableStatement :

var VariableDeclarationList ;

Приведите общее описание, абстрагируясь от алгоритма работы интерпретатора.

По-моему уже более, чем достаточно, и ваших "абстракций".

При наличии AssignmentExpression, интерпретатор всегда проходит пункт 8.6.2.2 [[Put]] (P, V)

Вы в очередной раз садитесь в лужу. Вы внимательно читали пункт, на который ссылаетесь? Если да, то почему не смогли понять? Попробую помочь Вам в очередной раз. Итак, Вы задали вопрос:

Как вы считаете, проходит ли алгоритм декларации переменной пункт 8.6.2.2 спецификации?

В описании создания переменных сказано следующее (фрагменты):

Variables are created when the execution scope is entered. Variables are initialised to undefined when created. A variable with an Itialiser is assigned the value of its AssignmentExpression when the VariableStatement is executed, not when the variable is created.

Ну и тривиальный пример для закрепления знаний:

alert(a); //=> variable is defined, its initial value is undefined

alert(b); //=> error, b is not defined

var a = 1;

b = 2;

Link to comment
Share on other sites

  • 0
Спор то интересный, а код придется самому дописывать.

Так ведь непонятно - то ли для Вас этот вопрос решен, то ли Вы потеряли к нему всякий интерес. WingedFox сделал предложения, а от Вас - ни ответа, ни привета, как говорится. Остается гадать - то ли помог он Вам, то ли нет, и нужно ли что-то еще...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy