Если вы используете внутренние функции, среда выполнения должна распределять и сохранять их контексты для любого будущего вызова, и это происходит каждый раз, когда вызывается содержащая их функция. В результате удобно представить, что объявление внутренней функции работает как конструирование объекта, членами которого являются просто переменные во внешней области вокруг этой функции.
Это может быть не так уж и плохо, если вы делаете это нечасто, поскольку объем памяти примерно такой же, как при выделении объекта в куче; (и есть некоторые умные оптимизации, которые вы можете сделать, чтобы избежать этого в некоторых случаях, например, если вы только передаете функцию вниз по стеку вызовов, который вы можете выделить в пространстве локального стека, или делаете некоторые вставки и т. д.). Однако в большинстве случаев это все еще распределение, поэтому вам следует избегать использования слишком большого количества из них в занятых циклах или создания многих внутренних функций.
Так что, чтобы ответить на ваш вопрос, вариант B будет быстрее в целом. Но пусть это вас не обескураживает!
Мой последний вывод заключается в том, что удобные внутренние функции полностью перевешивают небольшие накладные расходы времени выполнения, и я бы сказал, что используйте их везде, где это удобно. Если это оказывается узким местом в производительности, вернитесь и оптимизируйте их.