Почему этот параметр не используется?

#javascript #backbone.js

#javascript #backbone.js

Вопрос:

В магистрали 1.1.2, в строке 279

 // Return a copy of the model's `attributes` object.
toJSON: function(options) {
  return _.clone(this.attributes);
},
 

options явно не используется, так зачем он вообще там. Это просто потраченная впустую память.

Чего мне здесь не хватает?

Для каждого комментария вот один из способов вызова этого кода — так зачем передавать параметры, когда они не будут использоваться?

 toJSON: function(options) {
  return this.map(function(model){ return model.toJSON(options); });
},
 

Комментарии:

1. проблема с магистралью: параметр функции toJSON вводит в заблуждение

2. что вызывает практически тот же вопрос — зачем передавать аргумент параметру, который никогда не используется?

3. На самом деле он не тратит так много памяти, помните, что он передается по ссылке, но, тем не менее, этот параметр, очевидно, не должен быть там.

4. @user3293653: Вы даже потрудились прочитать ссылку, опубликованную t.niese, и ссылки на другие связанные с ней проблемы? В нем четко указано, почему существует параметр options .

5. Подумайте о том, как будет выглядеть такой комментарий: «этой функции передается параметр ‘options’, который может использоваться переопределяющими методами». Я думаю, как бы вы это ни говорили, это неудобно и потенциально сбивает с толку. В то время как простое указание параметра делает смысл совершенно понятным в краткой форме. Кроме того, вы, кажется, настаиваете на недостатке в отношении «использования памяти», но вы действительно не объяснили, насколько это будет значительным или даже реальным.

Ответ №1:

Это не тратит впустую память, поскольку аргумент должен быть доступен в arguments[0] любом случае (либо options — это вызов функции, и виртуальная машина в любом случае должна делать это для побочных эффектов, либо это просто объект, и поэтому это просто ссылка).

Он также служит ссылкой на документ о том, что могут реализовать суперклассы. Поскольку JS использует прототипы для своей объектной ориентации, если вы создадите toJSON функцию в одном из своих суперклассов, она будет использоваться вместо этого.

Ответ №2:

Нет никакой функциональной причины для включения этого параметра в Model.toJSON подпись — это исключительно в интересах разработчиков.

По ссылке, которую обнаружил @t.niese:

Доброе утро, @aoboturov! Спасибо, что указали на это. На самом деле это сделано намеренно и призвано напомнить вам, что collection.toJSON(options) по умолчанию передает аргумент options каждой из своих моделей. Подробности см. в #1222 и #1098.

(Обратите внимание, что ссылка #1222 — это, по сути, просто обман, а #1098 — это то место, где они добавили эту функцию в первую очередь.)

Другими словами, параметр помещен туда для большей ясности для разработчиков, которые могут захотеть переопределить Model.toJSON реализацию. Коллекция передается по объекту исходного Backbone.sync вызова options , поскольку некоторые реализации Model.toJSON могут захотеть его использовать.

Включение этого options параметра в подпись вообще не влияет на использование памяти (даже если бы это было так, эффект был бы незначительным), поскольку Collection.toJSON реализация в любом случае передает этот объект options в качестве аргумента.

Комментарии:

1. Вы используете фреймворк. Наличие параметра, на который нет ссылки в теле (но он должен быть в arguments любом случае), по сути, ничего не значит.

2. @user3293653 Следует ли добавлять комментарий или нет, зависит от разработчика API и их рекомендаций по кодированию. Я бы назвал хорошей практикой использовать его как реальный параметр. Есть много других вещей, которые действительно будут тратить память (особенно при передаче разных объектов в одну и ту же функцию).

3. @user3293653 это действительно не тратит впустую память. Не зная никаких подробностей о движках Javascript, ответ Ven выглядит для меня правильным — этот аргумент присутствует в любом случае как arguments[0] .

4. @user3293653 по иронии судьбы отсутствие option параметра может даже увеличить использование памяти. Поскольку движок JS может сначала скомпилировать его без параметра, а затем при вызове с одним параметром, может потребоваться скомпилировать вторую версию, принимающую один параметр (затем имеющую обе функции в памяти). Это, конечно, маловероятно в данной ситуации, но это может произойти.