这句话是否会评估为真?

时间:2016-08-22 17:46:39

标签: javascript

我是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?

3 个答案:

答案 0 :(得分:1)

  

我是否正确地假设无论传递给这个方法的人是什么,FIValidateForm.arguments.length == 1总是假的?

不,你可以这样做FIValidateForm.arguments.length 1:

FIValidateForm(justOneArgHere);

arguments表示函数的实际参数。 (参见下文关于argumentsFIValidateForm.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中不会计算缺少的参数。