Если вы никогда не подвергались воздействию динамических языков и понимаете JavaScript в скомпилированном языковом мышлении, у вас будет волшебное и странное чувство, потому что вещи, которые часто невозможны в сознании, и даже чувствуют себя неразумными. Если вы столкнетесь с этим чувством в процессе изучения JavaScript, свободного и бесконечного языка, то из нынешней формы, пожалуйста, отпустите ваше «предубеждение», потому что это определенно новый мир для вас, пусть JavaScript медленно растопит предыдущее укрепление программирования и внедрить новую жизнеспособность!
Хорошо, давайте вернемся к делу, сначала поймем контекстные характеристики Javascrtipt Динамически преобразованного времени выполнения. Эта характеристика в основном отражается в применении двух методов применения и вызова.
Чтобы различить подачу заявки, позвонить в одно предложение,
foo.call (this, arg1, arg2, arg3) == foo.apply (это, аргументы) == this.foo (arg1, arg2, arg3)
вызовать и применить оба принадлежат методу функции. Прототип. Это реализуется по сути двигателем JavaScript. Поскольку он принадлежит функции. Поскольку это свойство метода, их использование, конечно, направлено на метод. Эти два метода легко путать, потому что они имеют одинаковую функцию, но они используются по -разному.
Сходства: эффекты двух методов точно одинаковы
Различия: параметры, передаваемые методом, разные
Итак, каков эффект метода и каковы параметры, передаваемые методом?
Давайте проанализируем приведенный выше foo.call (this, arg1, arg2, arg3).
Foo-это метод, это объект, связанный с контекстом, когда выполняется метод, ARG1, ARG2 и ARG3-параметры, передаваемые методу FOO. Так называемый объект, связанный с контекстом, когда метод выполняется, если есть объектно-ориентированная основа, это легко понять, это в объекте после экземпляра класса.
В JavaScript код всегда имеет контекстный объект, а код обрабатывает его внутри. Объект контекста воплощается в этой переменной, которая всегда указывает на объект, в котором находится текущий код.
Чтобы лучше понять, что это такое, приведите пример.
/Создать функцию класса a a () {// Следующий код будет выполнен, когда класс создан // объект контекста выполнения в настоящее время - это то, что является текущим объектом экземпляра this.message = "Сообщение"; this.getMessage = function () {<span style = "Белое пространство: pre"> </span> return this.message; <span style = "белое пространство: pre"> </span>}} // Создать объект класса A var a = new a (); // Календация класса antember var var a = new a (); // cellendate exatence exance class vater alert alert alert alert alert alert alert alert alert alert alert alert alert alertmess (a); Функция класса b b () {this.message = "Сообщение B"; this.setMessage = function (msg) {<span style = "Белое пространство: pre"> </span> this.message = msg; <span style = "Белое пространство: pre"> </span>}} // Создать объект экземпляра класса B var a = new b ();Можно видеть, что классы A и B имеют атрибут сообщения (к участникам, упомянутым в объекте). A имеет метод GetMessage для получения сообщений, и у B есть метод SetMessage для установки сообщений. Следующее, чтобы показать силу вызова.
// Динамическое назначение метода SetMessage B на объект a. Обратите внимание, что у самого этого нет этого метода! b.setmessage.call (a, "a message"); // все отображают Alert "A Message" A "(A.GetMessage ()); // Динамическое назначение метода getMessage A -объекта b. Обратите внимание, что сам B не имеет этого метода!
Это сила динамического языка JavaScript Call!
Это просто «создавать что -то из ничего». Методы объекта могут быть назначены произвольно, но сам объект никогда не имел этого метода. Обратите внимание, что это назначение. С точки зрения непрофессионала, этот метод состоит в том, чтобы предоставить другой объект для выполнения задачи. В принципе, объект контекста меняется при выполнении метода.
Следовательно, b.setmessage.call (a, «Сообщение A»); эквивалентен использованию AS AS Context -объекта, чтобы вызвать метод SetMessage объекта B при выполнении, и этот процесс не имеет отношения с B, и его эффект эквивалентен A.SetMessage («Сообщение A»);
Поскольку эффект применения и вызова одинаково, можно сказать, что
Вызовите, применить функцию - это одолжить методы других людей, чтобы позвонить, так же, как вызов собственным.
Хорошо, после понимания сходства между вызовом и применением - после их понимания, давайте посмотрим на их различия. Посмотрев на приведенные выше примеры, я считаю, что вы знаете об этом.
От b.setmessage.call (a, «сообщение») эквивалентно a.setmessage («Сообщение А»). Можно видеть, что «сообщение А» передается как параметр в вызове,
Так как это означает применить? Трудно объяснить это четко. Применение должно быть объединено со сценариями применения, чтобы быть ясным с первого взгляда. Давайте разработаем сценарий приложения:
Функция печати (a, b, c, d) {alert (a + b + c + d);} Пример функции (A, B, C, D) {// Заимствование печати в методе вызова и явно рассеивает параметры для передачи печати. Метод непосредственно print.apply (this, аргументы); // или инкапсулировать его в массив print.apply (это, [a, b, c, d]);} // Пример «сценария с подсветкой» («Back», «Light», «Foot», «This»););В этом сценарии, в методе примера, A, B, C, D используется в качестве параметров, передаваемых методом, а методы используют применение и вызов, чтобы одолжить метод печати для вызова.
В последнем предложении, поскольку пример метода называется напрямую, контекстный объект в этом методе представляет собой окно -объект.
Следовательно, за исключением первого параметра, то есть контекстный объект такой же при выполнении, другие параметры метода вызова будут передаваться в заимствованный метод в качестве параметров по очереди, в то время как применение имеет два параметра, а второй параметр передается в массиве. Так можно сказать, что
Разница между методами вызова и применения состоит в том, что, начиная со второго параметра, параметры метода вызова будут передаваться в заимствованный метод в качестве параметров по очереди, в то время как применение непосредственно помещает эти параметры в массив, а затем передает их. Наконец, список параметров заимствованного метода одинаков.
Сценарии приложения:
Вызов доступен, когда параметры ясны, и применение аргументов можно использовать, когда параметры неясны.
// Пример print.call (Window, "Back", "Light", "foot", "this"); // параметры foo могут быть несколькими функциями foo () {<span style = "Белое пространство: pre"> </span> print.apply (window, аргументы);}Приведенная выше статья глубоко понимает разницу между методами Apply () и Call () в JavaScript. Это весь контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.