for (var shape in things) { ...
Это не ведет себя как foreach, а ведет себя больше как Perls:
foreach my $shape (keys $things) { ...
Таким образом, ваш код должен быть:
for (var shape in things) {
things[shape][0].color = Raphael.getColor();
...
Дополнительный ответ
Что касается синтаксиса функции, он довольно прост и очень распространен в современном js-коде, поэтому вам следует ознакомиться с ним.Построим эту функцию шаг за шагом.
Мы знаем:
function foo (x,y) {};
объявляет функцию, но в javascript функции могут быть анонимными:
function (x,y) {};
является функциейбез имениТеперь, в объявлении, это довольно бесполезно, но если мы сделаем это в выражении, то получим ссылку на эту функцию.Итак, как мы можем сделать это выражением?просто поставьте знак =
слева от него:
var foo = function (x,y) {}
- это выражение функции, назначающее функцию переменной foo.
Помимо того, что находится справа от =
знак, есть другие места, где код считается выражением.Один из них, когда код происходит внутри фигурных скобок.Это действительно математическое выражение:
var x = a * (b + c);
все, что справа от знака =
, является выражением, но (b+c)
является особенным, потому что это подвыражение, которое вычисляется первым.Это синтаксис ()
, который делает b+c
выражением самостоятельно.Аналогично:
(function (x,y) {})
заставляет то, что изначально выглядит как объявление функции, стать выражением функции.Правило взято из математического выражения ранее.
Как я упоминал ранее, выражение функции оценивается как ссылка на функцию.И одна из вещей, которые вы можете сделать со ссылкой на функцию, - это использовать ее для вызова функции:
var foo = function (x,y) {};
foo();
здесь, ()
после foo
означает что-то другое: оно используется для созданиявызов функции.Поскольку мы можем сделать вызов функции, используя ссылку на функцию, а выражение функции вычисляется как ссылка на функцию, мы можем вызвать функцию, не назначая ее какой-либо переменной:
(function (x,y) {})(); // think of it as foo() where foo=(function(x,y){})