新手必看:VV引擎Lua开发中变量作用域的5个常见误区
误区1:以为 local 和不加 local 效果一样很多新手写脚本直接用全局变量,觉得省事:
❌ 危险写法:
function OnPlayerLogin(name)
count = 0 -- 全局变量!
count = count + 1
print(count)
end
当服务器有100个玩家同时登录,所有人共用同一个 count,数据互相覆盖。
✅ 正确写法:
function OnPlayerLogin(name)
local count = 0 -- 局部变量,每次调用独立
count = count + 1
print(count)
end
原则:函数内的临时变量一律加 local,需要跨函数共享的数据用专门的表管理,而不是随手写全局变量。
---
误区2:在循环里用全局变量做计数器,定时器回调拿到的值全是最终值
❌ 经典闭包陷阱:
for i = 1, 5 do
SetTimer(i * 1000, function()
print(i) -- 全部输出 6,而不是 1 2 3 4 5
end)
end
原因:定时器回调执行时,循环早已结束,i 已经变成了 6。
✅ 用 local 捕获当前值:
for i = 1, 5 do
local n = i
SetTimer(n * 1000, function()
print(n) -- 正确输出 1 2 3 4 5
end)
end
这个坑在写多段延迟触发的副本脚本时几乎人人都踩过。
记住:定时器回调里用到的外部变量,进回调前先用 local 固定住。
---
误区3:require 的模块以为每次都重新加载
-- 文件A
local Cfg = require("Config")
Cfg.value = 999 -- 修改了模块内的值
-- 文件B
local Cfg = require("Config")
print(Cfg.value)-- 输出 999,不是原始值!
Lua 的 require 有缓存机制,同一个模块全局只加载一次,所有地方拿到的是同一个对象。
修改了就是全局修改。用只读表保护配置,或者让模块返回工厂函数而不是直接返回表。
页:
[1]