Какая альтернатива определению пока еще неопределенной переменной с помощью let внутри блока if-Statement? - PullRequest
3 голосов
/ 07 января 2020

Непосредственно перед вызовом функции с определенным именем я хотел бы объявить ее (с резервным определением), , если она еще не существует :

if (typeof myFunction === 'undefined') {
  
  let myFunction = () => console.log('Warning: myFunction() has not been defined.');
}

myFunction();

Но, , конечно, , let имеет область видимости блока, поэтому, несмотря на предоставление myFunction() запасного определения внутри if statement, myFunction() остается неопределенным вне блока if-Statement.


Самое простое решение - использовать var (который не имеет области видимости блока) вместо let:

var myFunction = () => console.log('Warning: myFunction() has not been defined.');

Это рекомендуемый подход? Или я упускаю что-то более традиционное?


NB Как может случиться так, что я не знаю, определена ли эта конкретная функция или еще не определена (либо с помощью let, const или var)?

Поскольку я выполняю постобработку сценария, созданного пользователем, который может включать или не включать определение этой функции и должен:

  • предоставить запасной вариант, если он еще не определен; или
  • ничего не делать, если это

Ответы [ 2 ]

4 голосов
/ 07 января 2020

Я бы сказал, что ваш подход с использованием var - это ваша лучшая ставка в этой очень, очень специфической c ситуации :

if (typeof myFunction === 'undefined') {
  
  var myFunction = () => console.log('Warning: myFunction() has not been defined.');
}

myFunction();

Опять же, это очень специфическая c ситуация, и, вероятно, один из очень немногих допустимых вариантов использования для var, который остался (возможно, the только один). Просто нет надежного способа использовать let (или const, и т. Д. c.) Для объявления привязки (свободно, переменной) в области видимости, когда вы не знаете, определено ли или как она уже определена.

Единственным другим полужизнеспособным решением было бы просто назначить его, но это указывало бы c на глобальную область видимости и не работало бы в строгом режиме.

var - ответ вот думаю.

2 голосов
/ 07 января 2020

Используйте typeof, чтобы проверить, была ли переменная уже определена, что не заботится о необъявленных переменных.

Затем, вместо попытки объявить переменную с произвольным именем, просто объявите переменную new с вашим собственным выбранным именем, которая будет содержать либо существующую функцию, либо резервную функцию, а затем используйте эту собственную переменную для вызова функции:

{
  const __the_callback = typeof myFunction == "function"
    ? myFunction
    : function fallback() { console.log("warning …"); };

  …
  __the_callback();
}

Просто убедитесь, что __the_callback не конфликтует с выбранным пользователем именем.

...