Почему shift () неправильно работает на моих аргументах из динамически вызываемой функции с помощью apply ()? - PullRequest
0 голосов
/ 10 августа 2011

Я работаю над системой динамической проверки.По какой-то причине, shift () в mainfunc массива args передает значение validateNumber не работает должным образом.Вот код с выводом в комментариях рядом с полями предупреждений:

function mainfunc (func){
    //this calls the function validateNumber and passes args to it.
    this[func].apply(this, Array.prototype.slice.call(arguments, 1));
}

function validateNumber(args) {
    alert(args); //this functions normally. for example, displays fish,3,5
    var text = args.shift; //would expect this to return 'fish', right?
    alert(text); //instead of 'fish' alerts 'function shift() { [native code] }'. This is the problem.
    var minimum = args.shift;
    var maximum = args.shift;
    return text;
}

validationArgs = classList[i].split('-');
    functionName = validationArgs.shift();
    validationArgs.unshift($(this).val());
    mainfunc(functionName, validationArgs); //calls mainfunc which calls the function

Я озадачен тем, почему это происходит именно так.Примечание: я набрал mainfunc из этого ответа StackOverflow: Вызов динамической функции с динамическими параметрами в Javascript

Редактировать: О боже мой.Я идиот.Я даже правильно использую shift () в заголовке вопроса!Спасибо всем.

Ответы [ 4 ]

2 голосов
/ 10 августа 2011
var text = args.shift; //would expect this to return 'fish', right?

Неправильно. Вам нужны парены, чтобы вызвать функцию. В противном случае вы просто получите саму функцию (которую вы видели в сообщении с предупреждением).

var text = args.shift();
2 голосов
/ 10 августа 2011

Это:

var text = args.shift;

это не вызов метода, вы хотите:

var text = args.shift();

Все, что делает ваш оригинал, назначает метод shift от args до text, следовательно, ваш:

function shift() { [native code] }

вывод в вашем alert. Выполнение args.shift не повлияет на args, поэтому эти два:

var minimum = args.shift;
var maximum = args.shift;

просто дать вам еще две ссылки на args.shift без изменения args.

1 голос
/ 10 августа 2011
var text = args.shift; //would expect this to return 'fish', right?

shift - это метод, вы хотели его вызвать или присвоить ссылку?

0 голосов
/ 10 августа 2011

Просто чтобы завершить здесь объяснение того, что происходило:

var p = args.shift;

- это метод назначения. Вы присвоили функцию shift, найденную в объекте args, переменной p, но фактически не выполняли эту функцию. В этот момент p содержит ссылку на функцию shift. Таким образом, когда вы alert(p), вы видите ссылку на собственный код (это код функции shift).

Принимая во внимание:

var p = args.shift();

находит функцию с именем shift в объекте args, выполняет ее без каких-либо параметров и затем присваивает возвращаемое значение этого метода переменной p.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...