环境
 全局变量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. 【BZOJ2276】Temperature

    题面 Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The ...

  2. /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)

    /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux) /usr/bin/ld: /usr/local/lib/lib ...

  3. andriod绘制图形

    使用view画图,有两个重要的组件需要介绍: (1)Paint 可以理解为画刷或者画笔,去主要用来设置绘图使用的颜色.填充方式.透明度.字体以及字体样式等. (2)Canvas 画布,在view上显示 ...

  4. 【mybatis】in查询+判断list查询条件是否进行in查询

    mybatis中的in查询: 并且判断in查询的list是否为null或者list有值才进行In查询 <select id="find" parameterType=&quo ...

  5. hibernate,mybatis,beetlsql 全面比較

    这是我的一个综合评分.总共分为12个单项.每一个单项最高5分.最低0分. 注意.评价仅仅包括这些软件提供的标准功能,不包括第三方提供的功能,如代码生成等. 开发效率 hibernate  能获取数据库 ...

  6. c++类型所占的字节和表示范围

    一:数值类型的大杂烩 (1)short.int 和 long 类型都表示整型值.存储空间的大小不同 一般, short 类型为半个机器字长,int 类型为一个机器字长,而 long 类型为一个或两个机 ...

  7. util.string.js

    ylbtech-JavaScript-util: util.string.js 字符串处理工具 1.A,JS-效果图返回顶部   1.B,JS-Source Code(源代码)返回顶部 1.B.1, ...

  8. python virtualenv virtualenvwrapper

    python中的virtualenv模块能够将项目环境分隔开,而不是使用全局的环境,非常实用. 首先pip install virtualenv 如何创建一个环境virtualenv testvir ...

  9. java的Commons包简介

    http://mxdxm.iteye.com/blog/758453 Jakarta Commons是Jakarta的一个子项目,目的是创建和维护独立于其他框架和产品的程序包(packages).Ja ...

  10. java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例

    java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...