2011-12-22 4 views
3

Редактировать: этот вопрос был задан из-за моего недоразумения. Соблюдайте осторожность, так как чтение это может растратить ваше время.Функции вызова и применения Javascript, вызываемые только первым аргументом?

Я думал, что call и apply выполнит функцию, заданную набором аргументов, но я получаю запутывающие результаты теста. Смотрите мой тестовый код:

window.z = 0; 
(function(){++(window.z)}).call(this, 1, 2, 3) 

Я бы ожидать z быть 3 после выполнения. Однако z равно 1.

(function(){++(window.z)}).apply(this, [1, 2, 3]) 

То же самое здесь. z == 1;
Я попытался просто протоколирование входного аргумента, а также:

var x = function(y){console.log(y);} 
x.call(this, 1, 2, 3); 

Результата? Записано только 1.
Что я здесь делаю неправильно?

(Испытано в Chrome и Firefox с Firebug.)

ответ

6

Оба call и apply только вызвать функцию один раз. Разница заключается в том, как передаются аргументы для вызова.

С вызовом каждый параметр после контекста (первый параметр) является параметром. При применении вторым параметром должен быть массив , например объект параметров (первый параметр все еще предоставляет контекст).

function foo(a, b, c) { 

}; 

foo.call(this, 1, 2, 3); // a == 1, b == 2, c == 3; 
foo.apply(this, [1,2,3]); // a == 1, b == 2, c == 3; 

Если вы хотите вызвать функцию несколько раз, вы можете выполнить это, просто поставив вызов в цикле.

3

Ожидается, что аргументы, которые вы передадите, будут присутствовать в вашей функции приращения (как arguments см. here for reference), но вы вызываете функцию только один раз.

2

Кажется, что у вас создается впечатление, что методы и apply должны вызывать functon один раз для каждого параметра. Это не так, он вызывает функцию только один раз.

apply The методов принимает массив аргументов:

func.apply(this, [1, 2, 3]); 

The call методов принимает список аргументов:

func.call(this, 1, 2, 3);