|
|
|
|
|
для: ЯСА
(19.02.2012 в 16:12)
| | Ещё доходчивее объяснили, но это я из Вашего 2-го поста уже всё понял. Вопрос Вы не поняли немного. На него уже ответили ниже. Благодарю, что не поленились написать такой подробный ответ не на тот вопрос. =) | |
|
|
|
|
|
|
|
для: SilentChild
(19.02.2012 в 15:54)
| | "f_Drop(true, lil)" - это СТРОКА.
Понимаете, нет?
Это - НАБОР СИМВОЛОВ.
Он, двойными кавычками специально для этого выделен.
При выполнении setInterval
setInterval("f_Drop(true, lil)", 100);
|
браузер эту строку "f_Drop(true, lil)" РАЗБИРАЕТ и ИНТЕРПРЕТИРУЕТ.
И определяет:
1) надо вызвать функцию с именем f_Drop
2) этой функции при вызове надо передать два аргумента
3) первый аргумент - константа true
4) второй аргумент - значение глобальной переменной с именем lil
Браузер начинает искать глобальную переменную lil и НЕ НАХОДИТ такой. Подставляет поэтому вместо её значения либо null, либо undefined.
А если НАХОДИТ эту переменную среди глобальных - тогда берет её текущее значение и передаёт в качестве второго аргумента функции.
------
Теперь иная запись:
setInterval("f_Drop(true, " + lil + ")", 100);
|
СРАЗУ при написании этой конструкции браузер СОЗДАЁТ СТРОКУ, в которой вместо переменной lil СРАЗУ подставляется её текущее значение. Будет lil в этот момент времени равно цифре 5, значит, получится строка "f_Drop(true, 5)", а будет в этот момент lil равен [Object], то браузер так и запишет "f_Drop(true, [Object])"
При исполнении браузер начнёт РАЗБИРАТЬ И ИНТЕРПРЕТИРОВАТЬ эту строку.
И в итоге вторым аргументом будет либо цифра 5, либо та хрень с Object
[поправлено модератором] | |
|
|
|
|
|
|
|
для: с телефона
(19.02.2012 в 15:51)
| | Ах вон оно в чём дело, да-да! Спасибо огромное. =) | |
|
|
|
|
|
|
|
для: ЯСА
(19.02.2012 в 15:45)
| | Очень доходчиво объяснили, благодарю. Не понимал, теперь понял схему работы функции в упомянутых Вами двух случаях. Но я немного не о том... а, собственно, вот о чём:
function f_Int(f)
{
var lil = event.srcElement;
clearInterval(Int);
if (f) {
Int = setInterval("f_Drop(true, lil)", 100);
}
}
|
Т.е. я могу переменную с именем lil делать локальной и код прекрасно работает, хотя lil - локальна, но стоит заменить имя на u и код не работает. | |
|
|
|
|
автор: с телефона (19.02.2012 в 15:51) |
|
|
для: SilentChild
(19.02.2012 в 15:34)
| | У вас имя идентификатора списка совпадает с именем переменной которую setInterval ищет в глобальной области видимости, и таким образом, вероятно, находит, напрямую. | |
|
|
|
|
|
|
|
для: SilentChild
(19.02.2012 в 15:34)
| | Потому что, прописывая u в виде символа строки
setInterval("f_Drop(true, u)", 100);
| , вы заставляете браузер при выполнении setInterval всякий раз искать глобальную переменную с именем u и подставлять её значение.
А когда вы пишете
setInterval("f_Drop('true', " + lil + ")", 5);
| , вы РАЗ И НАВСЕГДА заносите в setInterval текущее (на момент записи этой строки кода) значение переменной lil: глобальная она будет или локальная - никакой разницы уже НЕТ. Потому как в методе setInterval прописано константное ЗНАЧЕНИЕ, но не имя переменной. | |
|
|
|
|
|
|
|
для: ЯСА
(19.02.2012 в 15:13)
| | За true спасибо! Почему переменную с именем u нужно делать глобальной, в то время как ту же переменную с именем lil нет? | |
|
|
|
|
|
|
|
для: SilentChild
(19.02.2012 в 14:57)
| |
<script language="javascript">
var Int;
function f_Int(f)
{
var u = event.srcElement;
clearInterval(Int);
if (f) {
Int = setInterval("f_Drop('true', u)", 100);
}
}
|
* var делает переменную u локальной, а нужна глобальная. Уберите var
* true - зарезервированное слово, кавычки не нужны | |
|
|
|
|
|
|
|
для: с телефона
(19.02.2012 в 14:34)
| | Благодарю Вас, всё заработало. Но! ... возник попутная проблема, когда я заменил название переменной lil на u, вот так:
<script language="javascript">
var Int;
function f_Int(f)
{
var u = event.srcElement;
clearInterval(Int);
if (f) {
Int = setInterval("f_Drop('true', u)", 100);
}
}
|
....код перестал работать. Когда объявляю переменную за пределами функции, то код снова начинает работать, но переменная с именем lil работает даже тогда, когда её объявляешь локально, в функции, что не наблюдается с другими именами переменной. Очень странно. Заменял названия переменных на разные буквы, вроде y - тоже отказывается работать. Переименовываю обратно в lil - работает отлично! В чём может быть загвоздка? | |
|
|
|
|
автор: с телефона (19.02.2012 в 14:34) |
|
|
для: SilentChild
(19.02.2012 в 14:22)
| | У вас ещё было то, что вы передавали переменную как строковое значение.
Нужно было так:
Int = setInterval("f_Drop(true, lil)",5); | |
|
|
|
|