我正在开发一个动态验证系统。由于某种原因,传递给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
。