2011-11-28 6 views
1

Я изучаю 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!' 

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

+1

Для функции 'get_status' нет параметров, поэтому параметры не должны предоставляться. Если бы они были предоставлены, их просто проигнорировали бы. Код может использовать 'call' так же легко. – zzzzBov

+0

'.apply' не нужно,' .call' сделал бы то же самое. '.apply' - единственный способ передать неизвестное количество аргументов функции, которая вам здесь не нужна. В чем проблема? :) – Esailija

ответ

3

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

Он не утверждает, что два необходимы:

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 Plugin скелете на GitHub

0

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

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

+0

Его JavaScript, вы не * имеете * для передачи аргументов. Пока вы готовы принять последствия не прохождения ими :) – Chad

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

  • Нет связанных вопросов^_^