查看: 24|回复: 0

新手必看:VV引擎Lua开发中变量作用域的5个常见误区

[复制链接]

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
发表于 6 天前 | 显示全部楼层 |阅读模式
误区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 有缓存机制,同一个模块全局只加载一次,所有地方拿到的是同一个对象。
修改了就是全局修改。用只读表保护配置,或者让模块返回工厂函数而不是直接返回表。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表