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
对某些程序来说实际上是一个重要问题.
以下是对此的可能解释:
防止污染全球环境.模块的现代Lua约定是不让它们直接注册到全局表中.他们应该构建一个本地函数表并返回它们.因此,访问它们的唯一方法是使用局部变量.这迫使许多事情:
一个模块不会意外覆盖另一个模块的功能.
如果模块意外地执行此操作,则仍可访问模块返回的表中的原始函数.只有通过使用local modname = require "modname"
才能保证您完全获得该模块所暴露的内容.
包含其他模块的模块不能相互干扰.您从中获取的表require
始终是模块存储的内容.
阅读" local
变量访问速度更快"然后决定制作所有内容的人过早优化local
.
一般来说,这是一种很好的做法.好吧,除非是因为#2.
除了Nicol Bolas的回答,我还要补充第三点:
如果函数已从沙箱中排除,并且代码是从沙箱中加载的,那么它将无法工作.但是如果首先加载代码,则沙箱可以调用加载的代码并且能够从沙箱中排除setmetatable等.