在C#中,本地函数是这样的:
public int MyFunction(int parameter)
{
int local = 6;
return MyLocalFunction(4);
// Local Function
int MyLocalFunction(int localFunctionParameter) => 42;
}
在JavaScript中,嵌套函数是:
function MyFunction(parameter) {
var local = 6;
return MyNestedFunction(4);
// Nested Function
function MyNestedFunction(localFunctionParameter) {
return 42;
}
}
除了语法之外,它们之间是否存在任何性能差异?
答案 0 :(得分:3)
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
巧妙地不是“内部”MyFunction
,只是在包含类中。我说,这使得它们与嵌套函数的根本不同之处不仅仅是它们的名称。但是,它确实阻止我们在父函数之外使用该局部函数,这实际上是最终目标。
JavaScript实际上每次调用时都会重新创建它的函数实例,这对性能不利,也不必要。我确实找到了一种方法来防止这种行为。您将获取JavaScript示例并将其重写为:
var MyFunction = (function(parameter) {
return function(parameter) {
var local = 6;
MyNestedFunction(4);
};
function MyNestedFunction() {
return 42;
}
}());
对我来说这是笨重的,而不是我想要考虑本地/嵌套函数的方式。语法不像C#那样直观。
本地函数,因为它们最终会被移到类外,默认为从未被实例化两次的所需行为,因此它是两个世界中最好的。它具有更自然的语法和更好的性能(即使只是一点点)。