我是Javascript的新手,需要对这个脚本进行更改。然而,我注意到这行代码让我很困惑。
function FIValidateForm(aForWhom, aDoNotShowWarning, aFromWhere)
{
try
{
PAIWarnings = '';
var pBlFalg = true;
if (pBlFalg)
pBlFalg = mfpCheckForFISave(aForWhom, aDoNotShowWarning, aFromWhere);
if (pBlFalg == true)
pBlFalg = PAIErrors();
if ((pBlFalg) && (FIValidateForm.arguments.length == 1))
mfpIFWarnings();
return pBlFalg;
}
catch (err)
{
logError(err, arguments.callee.trace());
}
}
在运行期间,如果我在第三个if
语句上放置一个断点并检查FIValidateForm.arguments
,我可以看到一个包含3个项目的数组。第一个包含string
,第二个包含null
,第三个包含undefined
。该数组的长度仍为3。
我是否正确地假设无论何人传递给这种方法,FIValidateForm.arguments.length == 1
将永远是false
?或者是否有一些我不知道的其他值/调用此方法的替代方法,以便arguments.length
等于1?
编辑:我看到JS有一个arguments.length
和一个Function.length
。后者返回期望的参数数量......那么如何调用一个方法,以便在用3定义函数时该值为1?
答案 0 :(得分:1)
我是否正确地假设无论传递给这个方法的人是什么,FIValidateForm.arguments.length == 1总是假的?
不,你可以这样做FIValidateForm.arguments.length
1:
FIValidateForm(justOneArgHere);
arguments
表示函数的实际参数。 (参见下文关于arguments
与FIValidateForm.arguments
的 1 。)
如果你想要函数的 arity (正式声明的参数的数量),那就是FIValidateForm.length
并且它没有变化。
那么如何调用一个方法,以便在用3定义函数时该值为1?
JavaScript根本不强制执行正式参数的数量;你可以在没有参数,一个参数或者15的情况下调用你的函数。如果没有提供一个正式的参数(一个声明的参数,比如你的aDoNotShowWarning
),它在函数调用中的值将是{{1 }}。如果提供更多参数而不是声明参数,则只能通过undefined
伪数组访问它们(在ES5及以下版本中)。 (在ES2015及更高版本中,您可以将您的最后一个参数设为“休息参数”,这意味着它将是从该点开始的所有参数的数组。)
示例:
arguments
1 函数的function foo(a, b, c) {
console.log(arguments.length);
console.log(foo.length);
}
foo(1);
foo(1, 2);
属性 (例如arguments
)是JavaScript的非标准扩展,明确弃用通过严格模式(上面的例子会在严格模式下抛出错误)。只需使用为正常函数定义的独立符号FIValidateForm.arguments
(就好像它是一个局部变量)。
(在ES2015或更高版本中,您可以通过在参数声明中使用rest notation来避免使用arguments
。)
答案 1 :(得分:1)
不,它并不总是错误的。
如果您将其称为OnResize
,则Form1
如果您将其称为procedure TForm1.FormShow(Sender: TObject);
var
I: Integer;
VButton: TButton;
begin
for I := 1 to 10 do
begin
VButton := TButton.Create(FlowPanel1);
VButton.Parent := FlowPanel1;
VButton.Name := 'Button' + I.ToString;
VButton.Height := 200;
VButton.Width := 200;
end;
end;
,则FIValidateForm()
如果您将其称为FIValidateForm.arguments.length === 0
,则FIValidateForm(arg1)
如果您将其称为FIValidateForm.arguments.length === 1
,则FIValidateForm(arg1, arg2)
等等
如何,不要使用FIValidateForm.arguments.length === 2
。这是不好的做法,在严格的模式下被禁止。请改用FIValidateForm(arg1, arg2, arg3)
。
答案 2 :(得分:1)
TL; DR:如果您只使用一个参数调用该函数,functionName.arguments.length === 1
将为真。
是的,FIValidateForm.arguments.length
可以准确地为您提供FIValidateForm
的参数数量。
考虑这个函数f
:
function f(first, second) {
console.log('first argument:', first);
console.log('second argument:', second);
console.log('number of arguments:', f.arguments.length);
}
以及这两种情况:
// case 1:
f('something');
// prints:
// first: something
// second: undefined
// number of arguments: 1
// case 2:
f('something', undefined);
// prints:
// first: something
// second: undefined
// number of arguments: 2
注意undefined
是"默认"缺少参数的值,但与显式undefined
参数不同,f.arguments.length
中不会计算缺少的参数。