javascript - C# 本地函数与 JavaScript 嵌套函数有什么区别?
问题描述
在 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;
}
}
除了语法之外,它们两者之间是否有任何性能差异?
解决方案
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# 那样直观。
局部函数,因为它们最终会移出类,默认为永远不会被实例化两次的期望行为,所以它是两全其美的。它具有更自然的语法和更好的性能(即使只是一点点)。
推荐阅读
- reactjs - 将 Aysnc/await 与 Props 一起使用
- django - 使用 Django Memcached 缓存 Zip 对象
- ios - 如何调试金属错误?(国际足联)
- python - PyQt5 QFileDialog setFont
- kotlin - 没有应用程序的Javafx文件选择器?(科特林)
- c# - 如何获取 Expression.Lambda
> 通用 - xml - 使用 XSLT 将所有未嵌套的 XML 元素嵌套到一个新元素中
- python - 将值放在列标题和行标题上
- c++ - 为什么我的全局 new() 覆盖被绕过?
- java - Android - Gson 解析错误 - 格式错误的 Json 异常