环境
 全局变量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来查找
        环境主要用于加载模块等环节,另外的一个主要用途就是当作一个独立的数据存储集全
 

lua学习笔记(九)的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  4. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  5. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  6. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  7. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

  8. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  9. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

  10. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

随机推荐

  1. HDU 1863 畅通工程 最小生成树

    思路: 比较典型的最小生成树的题目了..在这里用求最小生成树的经典算法K(Kruskal)算法和P(Prim)算法.我的 K 算法用的是结构体来存图,P 算法用的是邻接矩阵来存图,K算法的复杂度是O( ...

  2. STL+Floyd【p1690】贪婪的Copy

    Description Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地.卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1<=Pi&l ...

  3. javascript 回调函数

    在javascript中回调函数非常重要,它们几乎无处不在.像其他更加传统的编程语言都有回调函数概念,但是非常奇怪的是,完完整整谈论回调函数的在线教程比较少,倒是有一堆关于call()和apply() ...

  4. [CF3B]Lorry

    题目大意: 有$n(n\leq 10^5)$个物品,背包的容量为$m(m\leq 10^9)$.每个物品有重量$w_i(w_i\in\{1,2\})$和价值$v_i(v_i\leq 10^4)$.问最 ...

  5. iOS -- tableView顶部留白

    最近iOS 11 下来之后需要适配系统,故此测试系统发现同一种机器上tableView与顶部控件,或者导航栏之间的有大量的留白: 这个问题是有的界面有,有的界面无: 修改与导航栏或者其他控件之间的距离 ...

  6. [置顶] kubernetes资源类型--secret和Service Account

    secret 概念 secret对象类型主要目的是保存和处理敏感信息/私密数据,比如密码,OAuth tokens,ssh keys等信息.将这些信息放在secret对象中比 直接放在pod或dock ...

  7. http://blog.csdn.net/muzizongheng/article/details/46795243

    http://blog.csdn.net/muzizongheng/article/details/46795243

  8. shell通配符、命令代换、引号

    1.通配符 (1)* :匹配多个任意字符 (2)? :匹配一个任意字符 (3)[若干字符] :匹配方括号中任意一个字符的一次出现 2.命令代换:反引号``或者$() 例1:vim test_th.sh ...

  9. tomcat修改默认访问首页

    找到conf下server.xml文件修改如下位置内容 <Host name="localhost" appBase="webapps" unpackWA ...

  10. Excel 数据导入SQL XML 自动生成表头

    去出差的时候应客户要求要要将Excel 文件内的数据批量导入到数据库中,而且有各种不同种类的表格,如果每一个表格多对应一个数据表的话, 按照正常的方法应该是创建数据表,创建数据库中映射的数据模型,然后 ...