Анонимные функции и потребление памяти - PullRequest
5 голосов
/ 29 ноября 2010

С точки зрения потребления памяти, они эквивалентны или мы получаем новый экземпляр функции для каждого объекта в последнем?

var f=function(){alert(this.animal);}
var items=[];
for(var i=0;i<10;++i)
{
    var item={"animal":"monkey"};
    item.alertAnimal=f;
    items.push(item);
}

и

var items=[];
for(var i=0;i<10;++i)
{
    var item={"animal":"monkey"};
    item.alertAnimal=function(){alert(this.animal);};
    items.push(item);
}

EDIT

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

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010

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

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

1 голос
/ 29 ноября 2010

Я не эксперт, но мне кажется, что разные движки javascript могут обрабатывать это по-разному.

Например, в V8 есть нечто, называемое скрытыми классами, которое может влиять на потребление памяти при доступе к тому же свойству. Может быть, кто-то может подтвердить или опровергнуть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...