lua类中的全局变量的生命周期(即在类外的local变量)

    在开发项目的过程中,界面需要设置坐标,为了便于管理图片的起始坐标我写到了类的方法外面,然后根据需要在类方法中对startX、posY、betweenX、betweenY等进行运算修改。
local className = class("className" , function()
    return display.newColorLayer(cc.c4b(0,0,0,122))
    end)

_className = nil

local startX = 320
local posY = 490
local betweenX = 240
local betweenY = 40
    原来我的理解是通过下面的方法每次添加删除之后,startX、posY、betweenX、betweenY等的值会被重新赋值,但是在实际运行中发现,require过一次之后,startX、posY、betweenX、betweenY这些值不会再被重新赋值,而是上一次调用时运算过后的值,这个使我的界面在显示的时候出现了bug。( ps:造成这个原因主要是我对require的原理和lua的闭包不熟悉)
function className.popOut()
    className.popIn()
    _className = className.new()
    local scene = display.getRunningScene()
    scene:addChild(_className ,100000)
end

function className.popIn()
    if _className ~= nil then
	_className:removeFromParent(true)
	_className = nil
    end
end

    后来经过网上查找资料和群里询问大佬,才明白require一次之后,package.loaded[modulename]中会保存这个值,再次require时,函数首先检查表package.loaded来判定modname是否已经存在,如果存在则require返回package.loaded[modname]所存储的值。所以这些局部的全局变量startX、posY、betweenX、betweenY等会和这个类一样的生命周期,即这些局部全局变量值startX、posY、betweenX、betweenY等会保存上次的运算结果。

    明白原理之后,我通过下面的代码删除之前保存的modulename(注:modulename是个绝对路径值,eg:"app.xxx.className"),这样之后每次require的时候都会保证是原来的初始值。

package.loaded[modulename] = nil
function className.popIn()
    if _className ~= nil then	        
        _className:removeFromParent(true)
	_className = nil
    end
    package.loaded["app.xxx.className"] = nil
end

 

require原理参考的博客:点击打开链接

闭包和upvalue参考博客:点击打开链接


你可能感兴趣的:(lua学习笔记)