Вызов JavaScript и применение функций, вызываемых только по первому аргументу? - PullRequest
3 голосов
/ 22 декабря 2011

Изменить: этот вопрос был задан из-за моего недопонимания.Продолжайте с осторожностью, поскольку чтение может потратить ваше время.

Я думал, что 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.)

Ответы [ 3 ]

6 голосов
/ 22 декабря 2011

Оба 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 голосов
/ 22 декабря 2011

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

2 голосов
/ 22 декабря 2011

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

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

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

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

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