2014-12-19 4 views

ответ

0

Эти два варианта не совпадают.

.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); 
+0

thx очень много !!! – chopic

2

Точка использования .apply здесь является то, что, по-видимому аргументы функции в массиве arguments. Эквивалентный код без .apply будет:

this._store.addData(arguments[0], arguments[1], ..) 

что, очевидно, хлопотно, если arguments является неизвестной длины.
Передача this._store снова - это только необходимость, это не пункт этого кода.

+1

Нет причин иметь несколько одинаковых ответов, поэтому я оставляю мину и +1 (хотя я был первым! ;-P) – zerkms

+0

thx very much !!! – chopic

Смежные вопросы