1

这是一个简单的 JavaScript 问题

我有一个带有两个参数的函数:

function myFunction(par1, par2) {

    //Part One
    //This will get executed always

    //Lots of logic here

    if (!par2) {


        //Part Two
        //this will not get executed if FALSE is passed as a second argument
        //more logic here

    }

}

在那个函数中我有 if,它的执行取决于 par2(它是 bool)

该函数在其他地方的代码中被多次调用,当它被调用时,两个部分都被执行。这是有意的。现在,我需要使用相同的功能,但我只需要执行第一部分。所以我想将第二个参数添加为 Bool 类型。它有效。

例如,调用如下函数:myFunction (par1) 将执行这两个部分。但是,如果 II 像这样调用它myFunction (par1, true),它将只执行第 1 部分。

这样可行。

我知道 Javascript 没有进行参数检查,在某些情况下我最终将 undefined 作为第二个参数。

我的问题是这是正常的做法吗?

4

3 回答 3

2

你可以有一个像这样的默认参数:

function myFunction (par1, par2) {
    par2 = typeof par2 !== 'undefined' ? par2 : false;

    ...
}

如果您在没有第二个参数的情况下调用该函数,它将安全地默认为false而不是undefined.

如果你发现你需要很多参数,并且不是所有参数都是必需的,你可以将一个对象作为参数。这为您提供了更大程度的灵活性,因为您可以选择省略参数而不用担心顺序:

function myFunction (params) {
    var defaults = {
        par1 : 'a',
        par2 : false
    }

    if(typeof params == 'undefined') params = {};
    for(var prop in defaults){
        params[prop] = typeof params[prop] == 'undefined' ? defaults[prop] : params[prop];
    }

    // you can now assume that all of the properties are set in params
    // they will either be the value passed, or the default
}

调用可能如下所示:

myFunction({
    par1 : 'a',
    par2 : 'b'
});

或任何其他组合:

myFunction({
    par1 : 'a'
});

甚至省略一切:

myFunction();
于 2013-07-04T10:39:47.690 回答
0

我知道 Javascript 没有进行参数检查,在某些情况下我最终将 undefined 作为第二个参数。

undefined会表现得好像你通过了false,因为它是一个虚假值。使用它没有错。

这是正常的做法吗?

是的,当然,另请参阅Javascript 中的函数重载 - 最佳实践。虽然不是显式传递,但false您通常只会省略参数。

于 2013-07-04T11:29:11.960 回答
0

是的,这是正常的,因为它会起作用,但是它更难维护和遵循..

函数调用的参数是函数的参数。参数按值传递给函数。如果函数更改了参数的值,则此更改不会在全局或调用函数中反映出来。

但是,对象引用也是值,并且它们很特殊:如果函数更改了引用对象的属性,那么该更改在函数之外是可见的。

这里有大量信息供您参考:REF

于 2013-07-04T10:39:44.223 回答