为什么shift()在使用apply()动态调用函数的参数上工作不正常



我正在开发一个动态验证系统。由于某种原因,传递给validateNumber的args数组mainfunc上的shift((操作不正确。以下是在警告框旁边的注释中输出的代码:

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

我不明白为什么会这样。注意:我从StackOverflow中剽窃了mainfunc的答案:在Javascript 中用动态参数调用动态函数

编辑:天哪。我是个白痴。我甚至在题目中正确地使用了shift((!谢谢大家。

这:

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

var text = args.shift; //would expect this to return 'fish', right?

错了。调用函数需要parens。否则,您将只得到函数本身(您在警报消息中看到了它(。

var text = args.shift();
var text = args.shift; //would expect this to return 'fish', right?

shift是一个方法,你是想调用它还是分配引用?

只是在这里完成对发生的事情的解释:

var p = args.shift;

是一个方法赋值。您已经将对象args上的函数shift分配给变量p,但实际上并没有执行该函数。此时,p包含对函数移位的引用。因此,当您alert(p)时,您会看到一个本地代码引用(这是shift函数后面的代码(。

鉴于:

var p = args.shift();

args对象上找到名为shift的函数并在没有任何参数的情况下执行它,然后将该方法的返回值分配给变量p

最新更新