Javascript 中的方法重载

IT技术 javascript jquery overloading
2021-01-19 23:54:47

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

function somefunction()
{
    //1st function
}

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

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

somefunction(); // function call goes here

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

6个回答

JavaScript 不支持方法重载(如在 Java 或类似版本中),您的第三个函数会覆盖之前的声明。

相反,它通过argumentsobject支持可变参数你可以做

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?
}

您也可以只检查typeof a == "undefined"等,这将允许调用somefunction(undefined), where arguments.lengthis 1这可能允许使用各种参数更轻松地调用,例如,当您有可能为空的变量时。

@RohitSharma 如果只有一个,那就是第一个。JavaScript 不支持命名参数,重要的是顺序。
2021-03-14 23:54:47
那么,我怎样才能让第一个参数成为可选的..?
2021-03-28 23:54:47
只为清关……!:) 但是,jQuery 的on()方法如何适用于不同类型的带参数使用。.on('event','selector',callback)or一样.on('event',callback),我们不会在那里为可选参数传递 undefined ..!
2021-04-04 23:54:47
如果只有一个参数传递给函数调用,我怎么知道它是哪个参数..?喜欢somefunction(something);
2021-04-05 23:54:47
@RohitSharma 你不能。当然可以打电话someFunction(undefined, someValue)
2021-04-08 23:54:47

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
    }
}

您只是somefunction使用每个新声明擦除变量

这相当于

   window.somefunction = function(...
   window.somefunction = function(...
   window.somefunction = function(...

Javascript 不提供方法重载。

正确的方法是:

  • 定义第三个函数并测试定义了哪些参数
  • 只传递一个包含参数的对象(这并没有真正不同,但更清晰)
这个答案是错误的。函数 somefunc(){ }; 将与var somefunc = function() {} 进行比较;作为证明,如果您稍后声明 function anotherFunction() { window.somefunc(); <--- 未定义的错误 }
2021-03-15 23:54:47

你不能在 JavaScript 中重载方法。在javascript中,函数存储在变量中。全局变量存储在 window 对象上。每个对象只能有一个同名的属性(独占键哈希)。

您可以做的是定义具有最多参数的定义,并检查传入的参数数量。

function Test(a, b, c)
{
    if(typeof a == 'undefined') 
    {
        a = 1;
    }

    if(typeof b == 'undefined') 
    {
        b = "hi";
    }

    if(typeof c == 'undefined') 
    {
        c = Date.Now;
    }
}

现在,如果我调用 Test(),它将表现得好像我调用了 Test(1, "hi", Date.Now)

JavaScript 中没有真正的函数重载,因为它允许传递任意数量的任意类型的参数。最好的做法是创建一个函数,如:myfunc(opt)

{
// with opt = {'arg1':'a1','arg2':2, etc}, then check your opt inside of the function
}