в javascript, как провести различие между пропущенным аргументом arg и переданным неопределенным аргументом - PullRequest
1 голос
/ 13 октября 2011

внутри функции, как различить не-arg и неопределенный arg?

myFunc( 'first' );

var obj = { a: 123 };
myFunc( 'first', obj.b );
_or_
myFunc( 'first', undefined )

arguments.length относится к аргументам мимо именованных аргументов, поэтому это не поможет Может быть легко решено с помощью arguments.length - извините за пердеть мозг!

function myFunc( a, b ) {

  // Case A: if no second arg, provide one
  // should be: if( arguments.length < 2 ) ...
  if( b === undefined ) b = anotherFunc;

  // Case B: if b is not resolved - passed but undefined, throw
  else if( b === undefined ) throw( 'INTERNAL ERROR: undefined passed' );

  // Case C: if b not a function, resolve by name
  else if( typeof b != 'function' ) { ... }

  ...
}

Как правильно захватить Дело A и Дело B в myFunc?

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Попробуйте что-то вроде:

function myFunc() {
  var a, b;

  if (arguments.length === 1) {
    a = arguments[0];
    console.log('no b passed');
  }
  else if (arguments.length > 1) {
    a = arguments[0];
    b = arguments[1];
    if (b === undefined) {
      console.log('undefined passed as parameter');
    }
  }

  console.log(a, b);
}

myFunc(1);
myFunc(1, undefined);
1 голос
/ 13 октября 2011

Я считаю, что нет кросс-браузерного совместимого способа делать именно то, что вы хотите.Более того, я думаю, что функция, которая меняет свое поведение, когда 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') { ... }     
   ...
 }
1 голос
/ 13 октября 2011

Я думаю, accepted answer для этого вопроса даст вам больше информации об этом: Как проверить неопределенную переменную в JavaScript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...