javascript - 这个陈述会评估为真吗?

标签 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?

最佳答案

Am I correct in assuming that no matter what one were to pass to this method, FIValidateForm.arguments.length == 1 will always be false?

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

FIValidateForm(justOneArgHere);

arguments 表示函数的实际参数。 (请参阅下面关于 argumentsFIValidateForm.arguments1。)

如果您想要函数的arity(形式声明参数的数量),那就是 FIValidateForm.length 并且它不会变化。

So then how does one call a method so that the value would be 1 when the function is defined with 3?

JavaScript 根本不强制要求形式参数的数量;您可以不带任何参数、一个参数或 15 个参数调用您的函数。如果未提供形式参数(声明的参数,如您的 aDoNotShowWarning),则它在函数调用中的值将是未定义。如果您提供的参数比声明的多,它们只能通过arguments 伪数组访问(在 ES5 及以下版本中)。 (在 ES2015 及更高版本中,您可以将最后一个参数设为“剩余参数”,这意味着它将是从该点开始的所有参数的数组。)


例子:

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


1 arguments 属性函数(例如,FIValidateForm.arguments)是一个非标准的JavaScript 的扩展,它被严格模式明确弃用(上面的例子在严格模式下会抛出错误)。只需使用为普通函数定义的独立符号 arguments(就好像它是局部变量一样)。

(在 ES2015 或更高版本中,您可以通过在参数声明中使用剩余符号来避免使用 arguments。)

关于javascript - 这个陈述会评估为真吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39085694/

相关文章:

Javascript获取没有查询字符串的url

javascript - 在另一个 Observable 完成后触发第二个表单提交点击

javascript - jQuery 中的鼠标悬停事件

javascript - 从现有 JSON 构建新 JSON

Javascript 以多行方式写入文本文件

javascript - 仅在选择框第二次更改后才触发更改上的 JQuery

javascript - 元素被包装在父类的第一次出现中

javascript - 包含特定类的 div 的 jquery 选择器

javascript - 当我们悬停在另一个 div 上时,隐藏的 div 出现并移动

javascript - [[Scope]] 内部属性在 ES6 中被什么替换了?