Javascript中的方法重载

Tec*_*hie 24 javascript jquery overloading

我在我的Javascript代码中使用如下方法重载.

function somefunction()
{
    //1st function
}

function somefunction(a)
{
   //2nd function
}

function somefunction(a,b)
{
   //3rd function
}

somefunction(); // function call goes here
Run Code Online (Sandbox Code Playgroud)

我不明白的是,如果我调用somefunction()javascript应该调用第一个函数,但问题是javascript实际上调用第三个函数.这是为什么?如何调用第1和第2功能?这是什么原因?有没有一种在Javascript中实现方法重载的正确方法?什么是行业标准?

Ber*_*rgi 41

JavaScript不支持方法重载(如Java或类似),您的第三个函数会覆盖以前的声明.

相反,它通过arguments对象支持变量参数.你可以做到

function somefunction(a, b) {
    if (arguments.length == 0) { // a, b are undefined
        // 1st body
    } else if (arguments.length == 1) { // b is undefined
        // 2nd body
    } else if (arguments.length == 2) { // both have values
        // 3rd body
    } // else throw new SyntaxError?
}
Run Code Online (Sandbox Code Playgroud)

你也可以只检查typeof a == "undefined"等,这将允许呼叫somefunction(undefined),其中arguments.length1.这可能允许使用各种参数调用缓动器,例如,当您有可能为空的变量时.


car*_*ira 9

JS将传递undefined给任何未提供的参数.如果你想要重载,你需要做类似下面的代码:

function someFunction(a, b) {
    if (typeof a === 'undefined') {
        // Do the 0-parameter logic
    } else if (typeof b === 'undefined') {
        // Do the 1-parameter logic
    } else {
        // Do the 2-parameter logic
    }
}
Run Code Online (Sandbox Code Playgroud)


Den*_*ret 8

你只是somefunction用每个新声明擦除变量.

这相当于

   window.somefunction = function(...
   window.somefunction = function(...
   window.somefunction = function(...
Run Code Online (Sandbox Code Playgroud)

Javascript不提供方法重载.

正确的方法是:

  • 定义第三个函数并测试定义的参数
  • 只传递一个包含参数的对象(实际上并不是很不同但更干净)