lua学习笔记(九)

 
环境
  全局变量table
         lua把所有的全局变量存在一个table里,并把这个table赋值给一个全局变量_G
         _G也在这个全局变量的table里,它就是一个普通的全局变量
         可以用这种方法遍历所有全局变量 for k, v in pairs(_G) do print(k,v) end
         可以使用_G["全局变量名"]来访问全局变量,与直接访问一样效果
         可以通过对_G设置元表来控制对全局变量的访问行为
         _G只是个全局变量,对其重新赋值则它就是别的东西了,这种情况只能通过getfenv找回全局table了
  非全局的环境
         lua中每个函数都可以有自己的环境
         lua中加载每个程序块其实就是把这个程序块看作是一个函数来调用一下
         每个程序块最后都可以有一行return xxx
        如果有require后返回的就是这个xxx
        所以可以想象一个程序文件被加载就是一个函数被调用了,这个文件的内容整个就是一个大函数
         因为每个函数都可以有自己的环境,所以每个程序块都有自己的环境
        这也正是为什么会命名为setfenv、getfenv了
        setfenv(f, table)
            1.第一个参数如果是函数则改变这个函数的环境为第二个参数的table
            2.第一个参数如果是数字,则1代表当前函数,2代表调用自己的函数,以此类推
        getfenv(f)
            1.参数f的使用方法与setfenv一样
            2.返回当前环境的table
        setfenv(1, {})如果这样调用则所有环境变量都将无法访问,包括如print函数,因为环境table是空的
         继承环境环境:
            envt = {}
            setmetatable(envt, {__index = _G})
            setfenv(1, envt)
            print("hello")
         在程序块中调用setfenv(1,table)就会修改当前程序块的环境
         每个新创建的函数(包括闭包)的环境都默认继承了创建者的环境
         当改变当前环境后,后续创建的函数的环境都将随之改变
         利用默认继承的功能方便 的实现命名空间之类的功能
         可以来回切换多个环境来实现多套变量定义和值内容
         函数在查找要访问的变量时总是以这种顺序,局部->全局->环境table元表的__index来查找
         环境主要用于加载模块等环节,另外的一个主要用途就是当作一个独立的数据存储集全
 

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