Эти два варианта не совпадают.
.apply()
as documented here on MDN, устанавливает значение this
при выполнении функции и передает массив аргументов этой функции, которые будут расширены в обычные аргументы функции.
Ваш второй пример кода передает массив аргументов аргументов фактической функции, а не расширенный список аргументов, так что они не совпадают.
В качестве примера, если есть три пункта в аргументах псевдо-массив, то первый вариант будет вызывать функцию так:
this._store.addData(arg1, arg2, arg3);
И ваш второй блок коды будет называть его так:
this._store.addData([arg1, arg2, arg3]);
Хотя технически это даже не передавая массив, передавая это псевдо-массив, который на самом деле не имеют методы массива.
Причина использования .apply()
есть когда у вас есть список аргументов в виде массива или массива, как структура, и вы хотите, чтобы вызвать функцию, используя этот список аргументов в качестве аргументов функции (передается в как нормальные аргументы). Это очень часто используется, когда вы хотите просто перенаправить аргументы из одной функции в другую или когда вы хотите изменить аргументы (например, удалить один или изменить один), а затем вызвать другую функцию со всеми остальными аргументами.
Или иногда .apply()
используется только для управления указателем this
и никаких аргументов не передается (хотя .call()
также может это сделать).
Как следствие, .call()
используется, когда вы точно знаете, сколько аргументов есть (например, вы знаете, есть два аргумента, и вы хотите, чтобы контролировать this
указатель или .call()
часто используется, когда вы просто хотите контролировать this
указатель и нет никаких аргументов. Преимущество .apply()
состоит в том, что вам не нужно знать, сколько аргументов есть - вы можете просто передать все аргументы (поэтому это особенно полезно, когда пересылать аргументы из одной функции в следующий), как при вызове конструктора базового класса или при проксировании для такой функции, как то, что делает .bind()
.
Этот this
указатель будет одинаковым в двух методов, потому что вызов obj.method()
установит значение this
для obj
которые в обоих случаях является вашим this._store
.
Обратите внимание, что эти два будут такими же:
this._store.addData(arguments);
this._store.addData.call(this._store, arguments);
thx очень много !!! – chopic