为什么要将全局Lua函数设为本地?

Ens*_*ble 12 lua scope function

我一直在看一些Lua源代码,我经常在文件的开头看到这样的东西:

local setmetatable, getmetatable, etc.. = setmetatable, getmetatable, etc..
Run Code Online (Sandbox Code Playgroud)

他们是否只使本地函数让Lua在经常使用时更快地访问它们?

Nic*_*las 13

本地数据在堆栈中,因此它们可以更快地访问它们.但是,我严重怀疑函数调用时间setmetatable对某些程序来说实际上是一个重要问题.

以下是对此的可能解释:

  1. 防止污染全球环境.模块的现代Lua约定是不让它们直接注册到全局表中.他们应该构建一个本地函数表并返回它们.因此,访问它们的唯一方法是使用局部变量.这迫使许多事情:

    1. 一个模块不会意外覆盖另一个模块的功能.

    2. 如果模块意外地执行此操作,则仍可访问模块返回的表中的原始函数.只有通过使用local modname = require "modname"才能保证您完全获得该模块所暴露的内容.

    3. 包含其他模块的模块不能相互干扰.您从中获取的表require始终是模块存储的内容.

  2. 阅读" local变量访问速度更快"然后决定制作所有内容的人过早优化local.

一般来说,这是一种很好的做法.好吧,除非是因为#2.


BMi*_*tch 5

除了Nicol Bolas的回答,我还要补充第三点:

  • 它允许您的代码在加载后从沙箱中运行.

如果函数已从沙箱中排除,并且代码是从沙箱中加载的,那么它将无法工作.但是如果首先加载代码,则沙箱可以调用加载的代码并且能够从沙箱中排除setmetatable等.