使函数根据接收的参数执行不同的逻辑

时间:2018-03-27 15:18:45

标签: javascript

假设我有一个类似于以下的JavaScript函数:

setCookies: function (redirectUri, code, profile, response) {
    var serviceRedirect = settings.getServiceUrl(),
        state = code ? code : uuid.new(),
        redirectCookie = profile ? redirectUri + '?profile=' + profile : redirectUri;

    cookies.set(names.state, state, response.config);
    cookies.set(names.redirectUri, redirectCookie, response.config);
}

因为这些值取决于传入的正确参数,我如何防御调用此函数的人:setCookies('http://localhost', response)

在这种情况下,当redirectUri设置为http://localhost时,code是否设置为response?为了确保设置正确的参数,我是否需要使用undefined调用函数来获取我不需要的参数?示例:setCookie(http://localhost', undefined, undefined, response);

由于

2 个答案:

答案 0 :(得分:1)

您基本上寻找的是function overloading,但JavaScript本身不支持。

以下是您的选择:

将参数作为单个对象。

 SELECT Name FROM tax WHERE Name regexp('21%') 

如果您可以使用ES6,则Object Destructuring会更容易:

function setCookies(args) {
  var redirectUri = args.redirectUri;
  var response = args.response;
  // ... and so on.
}

// and call it like:

setCookies({
  redirectUri: 'https://some.com',
  response: response
});

或者使用arguments对象的长度并检查支持的用法:

function setCookies({ redirectUri, response, profile, code }) {
  // Check the variable and do your stuff
}

您还可以通过检查变量类型进行更智能的猜测。

答案 1 :(得分:0)

只需在方法签名中首先订购您需要的参数。

function setCookies(redirectUri, response, code, profile) {
    var serviceRedirect = settings.getServiceUrl(),
    state = code ? code : uuid.new(),
    redirectCookie = profile ? redirectUri + '?profile=' + profile : redirectUri;

    cookies.set(names.state, state, response.config);
    cookies.set(names.redirectUri, redirectCookie, response.config);
}

setCookies('https://test.com', response);