четверг, августа 14, 2008

Откуда у функции length?

На днях столкнулся с такой проблемой.
После переноса цикла в функцию, в последней остался параметр length, который был локально обозначен перед циклом и был успешно там забыт. Но ошибки компилятор не выдал и косяк не был замечен сразу. Потом я обратил внимание на этот загадочный length.
Откуда же он взялся?
А взялся он от функции и равен количеству аргументов, заданных в сигнатуре функции. Он отличается от arguments.length тем, что arguments.length равен реально переданному количеству аргументов. Например, если компилировать в standard mode:
function traceLength(x:uint, y:uint):void
{
trace("получено: " + arguments.length);
trace("ожидалось: " + traceLength.length); // или просто length
}

traceLength(3, 5, 7, 11);
/* output:
получено: 4
ожидалось: 2 */
Ссылка на доку

2 комментария:

Анонимный комментирует...

Любопытно...Но зачем компилировать в Standart Mode? Я всегда в Strict собираю, а перед релизом вычищаю даже все warning'и по возможности

Andrey Gorbatov комментирует...

Никто и не призывает компилировать в Standrt mode. Просто надо быть внимательнее с переменной length, если она используется в методе. В моем случае при видимом отсутствии ошибки код выдавал невалидный результат.