Я считаю, что нет кросс-браузерного совместимого способа делать именно то, что вы хотите.Более того, я думаю, что функция, которая меняет свое поведение, когда undefined
передается явно (а не передается вообще), сбивает с толку.Тем не менее, ваша общая цель может быть достигнута путем небольшого изменения протокола.
Давайте рассмотрим, как вы хотите использовать my_func:
my_func(1) // case A
my_func(1, undefined) // case B
my_func(1, {}.b) // case B
my_func(1, "blah") // case C
Видите мою точку зрения?Случай A может произойти только в том случае, если вызывающая сторона передает один аргумент.
Таким образом, если вы разделите my_func()
на две функции: my_funcA
с одним аргументом и my_funcBC
с двумя аргументами, вы сможете правильно реализовать свою логику.
Единственное изменение, которое это вызывает, для вызывающей функции, это то, что если вызывающая сторона передает единственный аргумент, ему нужно вызвать my_funcA()
.Во всех остальных случаях следует назвать my_funcBC()
.
function my_funcA(a) {
my_funcBC(a, anotherFunc);
}
function my_funcBC(a, b) {
if (b === undefined)
throw( 'INTERNAL ERROR: undefined passed' );
if (typeof b != 'function') { ... }
...
}