【问题标题】:Approach to passing named arguments to a JavaScript Function. Any problems?将命名参数传递给 JavaScript 函数的方法。任何问题?
【发布时间】:2016-06-02 20:10:15
【问题描述】:

这与Passing named arguments to a Javascript function [duplicate]Named parameters in javascript 相关,但在我看来不是重复。

关于这些问题的各种答案和 cmets 提出了解决 JavaScript 语言对命名参数缺乏支持的方法。

original poster's 的担忧是:

使用类似的方法调用 Javascript 函数

someFunction(1, true, 'foo');

不熟悉功能就不是很清楚。

假设someFunction 在代码中的其他地方声明为:

function someFunction(numberOfClowns,wearingHat,screamingAtTopOfLungs) {
    console.log(arguments)
}

有什么特殊原因不能这样调用函数吗?

someFunction(numberOfClowns=1, wearingHat=true,screamingAtTopOfLungs='foo')

根据我的初步测试,这似乎不会导致任何错误,并且肯定解决了任何清晰度问题。

我猜你需要事先var所有变量,并注意变量赋值正在发生,所以不要太惊讶numberOfClowns现在等于1。还有什么我没有考虑的吗?

【问题讨论】:

    标签: javascript parameter-passing


    【解决方案1】:

    既然您只是将分配用作标签,为什么不简单地使用 cmets?

    someFunction(/*numberOfClowns=*/1,  /*wearingHat=*/true, /*screamingAtTopOfLungs=*/'foo')
    

    我已经在 C 代码中看到了这一点(特别是对于具有 5 个或更多参数的函数),它可以避免您提到的讨厌的副作用。

    由于实际上没有对 var-assignment 版本进行任何检查,因此这似乎具有所有相同的好处而没有缺点。

    【讨论】:

    • 这是另一个问题的推荐答案之一。在我记得 var 作用域和赋值问题之前,我想我最初更迷恋我的方法(我认为它更具可读性)。
    • 我赞成,但我认为@Bergi 的回答更明确地针对我的问题范围,因为我主要关心的是我的方法可能会遇到什么问题。
    【解决方案2】:

    我猜您需要事先对所有变量进行 var 化,并注意正在发生变量赋值

    这是我眼中的一个主要问题。它使这比任何其他方法都更复杂,而且它不是本地解决方案 - 你正在污染你的范围。

    还有什么我没有考虑的吗?

    命名参数/命名参数的主要参数是您可以根据需要对它们进行排序和省略,正确的值仍将最终出现在正确的变量中。您的方法不提供此功能。最好像大家一样只使用对象。

    我敢打赌,问题会比没有作业要多。

    【讨论】:

    • 这是一个很好的观点,因为命名参数的主要参数是由于参数顺序,也许以这种方式格式化它可能会给其他人一种印象,即您可以更改变量顺序而不会导致任何问题。
    【解决方案3】:

    正如您所说,赋值返回分配的值,因此如果正确声明变量,就没有问题。为了避免与同一函数中的其他代码发生冲突,我建议将调用包装在一个块中,并使用let 声明参数。

    function someFunction(numberOfClowns, wearingHat, screamingAtTopOfLungs) {
      console.log(numberOfClowns, wearingHat, screamingAtTopOfLungs);
    }
    {
      let numberOfClowns, wearingHat, screamingAtTopOfLungs;
      someFunction(numberOfClowns=1, wearingHat=true, screamingAtTopOfLungs='foo');
    }

    您可能还对解构对象感兴趣:

    function someFunction({numberOfClowns, wearingHat, screamingAtTopOfLungs}) {
      console.log(numberOfClowns, wearingHat, screamingAtTopOfLungs);
    }
    someFunction({numberOfClowns: 1, wearingHat: true, screamingAtTopOfLungs: 'foo'});

    【讨论】:

    • 他已经知道他可以做到这一点。他想知道他是否错过了任何不这样做的理由。 (他说他知道他也需要声明本地变量。)
    • 附带说明,解构是 es2015 的一个特性,所以如果你想让它在所有浏览器上运行,请先通过 Babel 运行你的代码 :)
    • @DaoWen 好的,我跳过了问题的最后一段。我已经改写了答案。
    • 赞成在块内使用let 以防止踩踏范围。
    猜你喜欢
    • 2013-07-09
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2011-07-02
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多