0

我正在开发一个动态验证系统。出于某种原因,传递给 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:Calling dynamic function with dynamic parameters in Javascript

编辑:哦,我的天哪。我是一个白痴。我什至在问题的标题中正确使用了 shift() !谢谢大家。

4

4 回答 4

2

这:

var text = args.shift;

不是方法调用,你想要:

var text = args.shift();

您原来所做的就是将shift方法 from分配argstext,因此您的:

function shift() { [native code] }

在你的输出alert。这样做args.shift不会args对这两个产生任何影响:

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

只需再给您两个参考,args.shift而无需更改args

于 2011-08-10T05:05:10.587 回答
2
var text = args.shift; //would expect this to return 'fish', right?

错误的。您需要括号来调用函数。否则,您将只获得函数本身(您在警报消息中看到)。

var text = args.shift();
于 2011-08-10T05:05:17.077 回答
1
var text = args.shift; //would expect this to return 'fish', right?

shift是一种方法,您是要调用它还是分配引用?

于 2011-08-10T05:05:15.510 回答
0

只是为了完成这里发生的事情的解释:

var p = args.shift;

是一个方法赋值。您已将shift在对象上找到的函数分配args给变量p,但实际上并未执行该函数。此时,p包含对函数 shift 的引用。因此,当您alert(p)看到本机代码引用(即 shift 函数背后的代码)时。

然而:

var p = args.shift();

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

于 2011-08-10T06:15:45.593 回答