class a {
def v1 = "v1 in a"
static def v2 = "v2 in a"
def v4 = "v4 in a"
def v5 = "v5 in a"
def va = "va in a"
def b() {
def v1 = "v1 in a.b()"
def v2 = "v2 in a.b()"
def v4 = "v4 in a.b()"
def g = {
def v0 = "v0 in closure g"
def h = {
//function b里面已经定义v4 = "v4 in a.b()"所以下面这行
//报错:The current scope already contains a variable of the name v4
//def v4 = "v4 in closure h"
}
}
def c = {
//下面的这行代码报错:The current scope already contains a variable of the name v1
//def v1 = "v1 in closure c"
println v1
println owner
println this
//下面这行定义v5变量正常,输出的结果也是:v5 in closure c
def v5 = "v5 in closure c"
println v5//v4
println va
}
println "***" + c.toString() + "***"
c() return "b func"
} def d = {
println v1;
println v2;
println v4;
def v5 = "v5 in closure d"
println v5
} def e = {
def v1 = "v1 in closure e"
def f = {
//下面这行代码报错:The current scope already contains a variable of the name v1
//def v1 = "v1 in closure f"
println v1 //下面这行就没错,因为闭包e的v2是在后面定义的
def v2 = "v2 in closure f" //下面这行报错,v3在f里面不可见
//println v3 def vf = "vf in closure f"
}
f()
def v2 = "v2 in closure e"
def v3 = "v3 in closure e" //在闭包e里面vf不可见
//println vf
}
}
def test(x) {
println "func test start --- x:" + x
def v1 = 1000
def v2 = 2000
def v3 = 3000 x()
println "func test--- end:"
}
test(new a().d)
println "--------------"
//println new a().v4
println new a().b()
new a().e() /*
通过上面的测试代码可以看出:
1.在闭包a里面定义的闭包b,那么b中定义的变量不能和和闭包a里面定义的变量名字相同.
2.在函数a里面定义的闭包b,那么b中定义的变量不能和和函数a里面定义的变量名字相同.
3.由此也可以推导出:在函数a里面定义闭包b,在闭包b里面定义闭包c,那么c中定义
的变量也不能和函数a中定义的变量名字相同,对于任意多层闭包嵌套也是如此
在闭包里面的符号查找方面:
首先在闭包里面查找,如果闭包里面没有定义,则有两种情况(假设delegate策略是Closure.OWNER_FIRST,其它策略是一样的):
1.如果这个闭包的外层是函数,则现在函数里面查找,如果函数里面也没有定义,则进入delegate策略即在owner里面查找,
如果owner里面没有,则在delegate里面查找,ruguo delegate里面没有就报错
2.如果这个闭包没外层不是函数,则直接进入delegate策略即在owner里面查找,如果owner里面没有,则在delegate里面查找
如果delegate里面没有就报错. */

Groovy里面闭包中变量符号的查找与变量定义的限制的更多相关文章

  1. python中函数嵌套、函数作为变量以及闭包的原理

    嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer():    name ...

  2. Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  3. (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找

    环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...

  4. $ -----JavaScript 中美元符号 $ 的作用

    JavaScript 中美元符号 $ 是什么 1.首先可以用来表示变量,比如变量 var s='asdsd'或var $s='asdasd'; 2.在正则表达式中,它可以匹配结尾:/sa$/.test ...

  5. js的闭包中关于执行环境和作用链的理解

    首先讲一讲执行环境: 执行环境按照字面上来理解就是指目前代码执行所在的环境. 当JavaScript代码执行的时候,会进入不同的执行上下文,这些执行上下文会构成了一个执行上下文栈(Execution ...

  6. 【转】【bat】Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  7. 环境变量和文件查找&文件打包与解压缩

    环境变量和文件查找 介绍环境变量的作用与用法 及几种搜索文件的方法 学会这些技巧可以高效地使用 Linux 知识点:环境变量的设置 环境变量的修改 环境变量 要解释环境变量,得先明白变量是什么,准确的 ...

  8. 在VIM中进行快速的查找和替换

    VIM是被誉为非常高效的文本编辑软件.但是掌握并高效的使用是件有难度的事情.在VIM中进行快速的查找和替换是提高VIM使用效率的重要方法.下面是我在阅读VIM用户手册时整理的一些资料: 行内搜索. f ...

  9. 关于javascript闭包中的this对象

    我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...

随机推荐

  1. android等待对话框

    等待对话框,这里有两种方式来实现: ProgressDialog方式 progressDialog初始化 private void initProgressDialog() { progressDia ...

  2. AI移动自动化测试框架设计(解读)

    声明:原文出自"前端之巅"微信公众号"爱奇艺基于AI的移动端自动化测试框架的设计"一文,作者:何梁伟,爱奇艺Android架构师.文章提供了一种基于AI算法的自 ...

  3. mybatis动态数据更新 + 批量动态数据插入

    动态更新 <update id="updateElevator" parameterType="com.diantijiang.saas.data.elevator ...

  4. icpc南宁站赛后总结

    11月24号,我们经过26个小时的火车来到了广西南宁,一场漫长的过程. 24号晚到达南宁,做地铁到达学校,找到住的地方,南宁的天真是让人无奈. 25号,上午去广西大学体育馆报道,然后回去好好整理了一下 ...

  5. PHP二维数组去重(指定键名)

    本例对二维数组中某个指定键名进行去重,发现网上大多使用array_unique或是foreach遍历等方式去重,效果不佳且较为繁琐. 本文以二维数组去重为引,介绍array_column函数的三种用法 ...

  6. iframe 高度自适应

    <iframe id="InputDetail" src style="width:100%"></iframe> <script ...

  7. JS confirm或alert对话框中的换行

    如题. alert.confirm对话框的换行可以使用回车符或换行符:\n,\r 也可以使用回车符或换行符对应的unicode编码:\u000a,\u000d,这是等效的. //确认信息 var co ...

  8. python + django + echart 构建中型项目

    1. python生产环境, 多层modules 导入问题: 多个modules 如何导入不同级别的包: 在每个modules下新建 __init__.pyimport os, sys dir_myt ...

  9. npm install报错

    npm ERR!    C:\Users\xxxxxx\AppData\Roaming\npm-cache\_logs\2019-02-27T07_48_47_283Z-debug.log " ...

  10. MyBatis-Plus

    一.通用SQL 1.简介:(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 2.定义Javabean中成员变量所使用的的类型: ...