2016-08-22 62 views
1

我是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.lengthFunction.length。后者返回预期的数量的参数...那么,如何调用一个方法,以便在函数定义为3时值为1?

+3

尝试用第一个参数调用该函数,看看会发生什么。 –

回答

1

我正确地认为无论传递给这个方法的是哪一个,FIValidateForm.arguments.length == 1都将是错误的吗?

不,你可使其FIValidateForm.arguments.length 1通过这样做:

FIValidateForm(justOneArgHere); 

arguments代表实际参数的功能。 (见低于约argumentsFIValidateForm.arguments

如果你想要的功能的元数(正式声明的参数个数),这就是FIValidateForm.length,并没有改变。

那么如何调用一个方法,使得当函数定义为3时该值为1?

JavaScript根本不执行正式参数的数量;你可以不带任何参数,一个参数或者15来调用你的函数。如果没有提供一个正式的参数(一个声明的参数,比如你的aDoNotShowWarning),它在函数调用中的值将是undefined。如果您提供以上的自变量,则只能通过arguments伪阵列访问它们(在ES5及更低版本中)。 (在ES2015及以上版本中,您可以将最后一个参数设置为“休息参数”,这意味着它将成为此时所有参数的数组。)


实施例:函数的

function foo(a, b, c) { 
 
    console.log(arguments.length); 
 
    console.log(foo.length); 
 
} 
 
foo(1); 
 
foo(1, 2);


arguments属性(例如,FIValidateForm.arguments)是一个非标准扩展为JavaScript ,这是明确的通过严格模式弃用(上面的示例会在严格模式下引发错误)。只需使用为正常功能定义的独立符号arguments(就像它是一个局部变量)。

(在ES2015或更高版本,可以尽量避免使用arguments在所有使用其他符号对你的论点,而不是声明)

1

不,它不会永远是假的。

  • 如果你把它作为FIValidateForm(),然后FIValidateForm.arguments.length === 0

  • 如果你把它作为FIValidateForm(arg1),然后FIValidateForm.arguments.length === 1

  • 如果你把它作为FIValidateForm(arg1, arg2),然后FIValidateForm.arguments.length === 2

  • 如果你叫它FIValidateForm(arg1, arg2, arg3),然后FIValidateForm.arguments.length === 3

  • 等等

Howver,不使用FIValidateForm.arguments。在严格模式下这是不好的做法和禁止。改为使用arguments

1

TL; DR:如果您只使用一个参数调用该函数,则functionName.arguments.length === 1将为true。


是,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