Программирование функции Javascript - получение сложных параметров - PullRequest
1 голос
/ 28 марта 2010

Я пишу функцию Javascript, которая будет манипулировать массивом, написанным на лету и отправленным в качестве параметра.

Функция записывается следующим образом:

function returnJourney(animation,clean){
    var properties = {};
    // loads of other inane stuff
    for(i in animation[0]) properties[animation[0][i]] = animation[0].i;
    // heaps more inane stuff
}

Рассматриваемая анимация - это набор параметров для анимации jQuery. Обычно он принимает формат ({key:value,key:value},speedAsInteger,modifierAsString).

Итак, чтобы начать первоначальную отладку, я называю это:

returnJouney(({'foo':'bar'},3000),1);

И с самого начала дела идут далеко. Насколько я понимаю, это будет означать, что returnJourney будет подтверждать clean === 1, а animation - массив с объектом в качестве первого дочернего элемента и числом 3000 в качестве второго.

Firebug говорит мне animation оценивает как число 3000. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 28 марта 2010

В JavaScript нет типа кортежа. Все, что у вас есть, это либо объект {}, либо массив []. Они оба могут понимать любую смесь типов. Таким образом, вы можете передать свой параметр анимации как массив ([{'foo':'bar'},3000]), который выглядит именно так, как вы хотели. Или, как это обычно делается в JavaScript, вместо этого используйте объект:

returnJourney({props: {foo: "bar"}, speed: 3000}, 1);

function returnJourney(animation, clean) {
     var props = animation.props;
     var speed = animation.speed;
}

Обратите внимание, что объектная нотация позволяет вам игнорировать вещи, которые вы не хотите передавать, и очень ясно дает понять, что означает значение.

Что касается того, почему ваш animation разрешается как 3000, это действительно просто, вот как работает оператор ,. Возвращает последнюю вещь в фигурных скобках. Таким образом, (10, 20, 30) будет оцениваться как 30, так же будет (f(1000), "hello", 30). Только последнее значение имеет значение, другие просто игнорируются (но все равно запускаются, поэтому любые побочные эффекты будут присутствовать).

1 голос
/ 28 марта 2010
properties[animation[0][i]] = animation[0].i;

должно быть

properties[animation[0][i]] = animation[0][i];

.i это свойство, буквально называемое 'i'. Поскольку этого (вероятно) не существует, вы будете назначать undefined каждому свойству.

returnJouney(({'foo':'bar'},3000),1);

также не имеет большого смысла - вы имеете в виду массив?:

returnJourney([{'foo':'bar'},3000],1);

(в JavaScript нет типа «кортеж».)

Также используйте var i in вместо (опечатка) in in. Забвение var дает вам случайный глобальный эффект с потенциально раздражающими отладочными побочными эффектами.

0 голосов
/ 28 марта 2010

Он обрабатывает ({'foo':'bar'},3000) как выражение, используя оператор запятой, который возвращает правильный операнд в качестве результата. Возможно, вы имели в виду [{'foo':'bar'},3000].

...