C # и JavaScript по-разному обрабатывают свои вложенные / локальные функции.
В вашем примере C # включит компиляцию этого кода:
public int MyFunction(int parameter)
{
int local = 6;
return MyLocalFunction(4);
// Local Function
int MyLocalFunction(int localFunctionParameter) => 42;
}
В этот код:
public int MyFunction(int parameter)
{
int num = 6;
return <MyFunction>g__MyLocalFunction|0_0(4);
}
[CompilerGenerated]
internal static int <MyFunction>g__MyLocalFunction|0_0(int localFunctionParameter)
{
return 42;
}
Как видите, <MyFunction>g__MyLocalFunction|0_0
умно не"inside" MyFunction
, просто в содержащем классе.Я бы сказал, что это делает их принципиально отличными от вложенных функций не только по названию.Это, однако, не позволяет нам использовать эту локальную функцию вне родительской функции, которая на самом деле является конечной целью.
JavaScript фактически воссоздает свой экземпляр функции каждый раз, когда он вызывается, что плохо для производительности, а также излишне.Я нашел способ предотвратить такое поведение.Вы бы взяли свой пример JavaScript и переписали бы его примерно так:
var MyFunction = (function(parameter) {
return function(parameter) {
var local = 6;
MyNestedFunction(4);
};
function MyNestedFunction() {
return 42;
}
}());
Что для меня неуклюже и не так, как я хочу думать о локальных / вложенных функциях.Синтаксис не такой интуитивно понятный, как в C #.
Локальные функции, потому что в конечном итоге они перемещаются за пределы класса, по умолчанию используется желаемое поведение, никогда не встречающееся дважды, так что это лучшее из обоих миров.У него более естественный синтаксис и лучшая производительность (пусть даже немного).