почему применяется только один параметр в этом случае? - PullRequest
1 голос
/ 28 ноября 2011

Я изучаю apply и пытаюсь понять, почему код, который я изучаю, передает только один параметр для применения.

Сначала я определяю Quo:

var Quo = function(string) {
  this.status = string;
};

Далее я определяю get_status:

Quo.prototype.get_status = function() {
  return this.status;
};

Я определяю statusObject:

var statusObject = {
  status: 'yo!'
};

И вот где я потерялся:

var status = Quo.prototype.get_status.apply(statusObject);
// status is 'yo!'

Согласно Документация"Применить Вызывает функцию с заданным значением this и аргументами, представленными в виде массива."Вы можете видеть, что в случае применения apply я передаю только один параметр, который, по моему мнению, определяет «this».Можете ли вы прояснить, что именно происходит в этом методе, почему необходимо применять метод и почему в этом случае я могу передать только один параметр в метод, когда в нем указано, что необходимы два параметра.Спасибо.

Ответы [ 3 ]

3 голосов
/ 28 ноября 2011

apply устанавливает контекст функции, применяемой к объекту, указанному в первом параметре.

var o;
function baz(a, b, c) {
  //do stuff
}

o = {
  foo: 'bar'
};

baz.apply(o);
//this is o
//a is undefined
//b is undefined
//c is undefined

Если массив передан в качестве второго параметра, параметры будут установлены на основе значений в массиве:

baz.apply(o, [1,2,3]);

//this is o
//a is 1
//b is 2
//c is 3

Второй параметр в apply является необязательным, однако call обычно используется для контекста настроек:

//these do the same thing
baz.call(o);
baz.apply(o);

//this is how they're different
baz.call(o, 1, 2, 3);
baz.apply(o, [1, 2, 3]);
2 голосов
/ 28 ноября 2011

Это не означает, что нужно два:

fun.apply(thisArg[, argsArray])

обратите внимание, что argsArray в скобках, это необязательно.

То, что происходит по вашему вызову, заключается в том, чтоваш statusObject передается в качестве аргумента this вашей функции get_status.

Это означает, что когда get_status выполняется и выполняет return this.status, по сути, возвращается statusObject.status.

Применить полезно по многим причинам, одна из которых заключается в динамическом вызове методов.Я могу передать строковое имя метода в вызываемом объекте следующим образом:

methods = {
    init: function(message) {
        alert(message);
    }
};
function executeFunc(method) {
    methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
}

//now I can call like this:
executeFunc('init', 'Hey there, this is a message');

Пример этого можно найти в моем скелете плагина jQuery на GitHub

0 голосов
/ 28 ноября 2011

apply принимает один аргумент, объект для использования в качестве this, за которым следуют аргументы , если есть .

Если функция не принимает аргументов, например, у вас есть function f() { ... }, вам не нужно передавать никаких аргументов, поэтому вы можете позвонить f.apply(someObject);.

...