设为首页
收藏本站
切换到宽版
官网
论坛
资格申请
更新日志
游戏体验
热搜
活动
交友
discuz
登录
|
VV Engine 官方中心
»
论坛
›
综合交流
›
胡说八道
›
新手必看:VV引擎Lua开发中变量作用域的5个常见误区 ...
返回列表
发新帖
查看:
24
|
回复:
0
新手必看:VV引擎Lua开发中变量作用域的5个常见误区
[复制链接]
tibaiwan1888
tibaiwan1888
当前离线
积分
1212
46
主题
42
回帖
1212
积分
金牌会员
金牌会员, 积分 1212, 距离下一级还需 1788 积分
金牌会员, 积分 1212, 距离下一级还需 1788 积分
积分
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 有缓存机制,同一个模块全局只加载一次,所有地方拿到的是同一个对象。
修改了就是全局修改。用只读表保护配置,或者让模块返回工厂函数而不是直接返回表。
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
快速回复
返回顶部
返回列表