Function overloading in Javascript - Best practices

后端 未结 30 1958
难免孤独
难免孤独 2020-11-22 03:33

What is the best way(s) to fake function overloading in Javascript?

I know it is not possible to overload functions in Javascript as in other languages. If I neede

30条回答
  •  梦如初夏
    2020-11-22 03:58

    This is an old question but one that I think needs another entry (although I doubt anyone will read it). The use of Immediately Invoked Function Expressions (IIFE) can be used in conjunction with closures and inline functions to allow for function overloading. Consider the following (contrived) example:

    var foo;
    
    // original 'foo' definition
    foo = function(a) {
      console.log("a: " + a);
    }
    
    // define 'foo' to accept two arguments
    foo = (function() {
      // store a reference to the previous definition of 'foo'
      var old = foo;
    
      // use inline function so that you can refer to it internally
      return function newFoo(a,b) {
    
        // check that the arguments.length == the number of arguments 
        // defined for 'newFoo'
        if (arguments.length == newFoo.length) {
          console.log("a: " + a);
          console.log("b: " + b);
    
        // else if 'old' is a function, apply it to the arguments
        } else if (({}).toString.call(old) === '[object Function]') {
          old.apply(null, arguments);
        }
      }
    })();
    
    foo(1);
    > a: 1
    foo(1,2);
    > a: 1
    > b: 2
    foo(1,2,3)
    > a: 1
    

    In short, the use of the IIFE creates a local scope, allowing us to define the private variable old to store a reference to the initial definition of the function foo. This function then returns an inline function newFoo that logs the contents of both two arguments if it is passed exactly two arguments a and b or calls the old function if arguments.length !== 2. This pattern can be repeated any number of times to endow one variable with several different functional defitions.

提交回复
热议问题