1. class a {
  2. def v1 = "v1 in a"
  3. static def v2 = "v2 in a"
  4. def v4 = "v4 in a"
  5. def v5 = "v5 in a"
  6. def va = "va in a"
  7. def b() {
  8. def v1 = "v1 in a.b()"
  9. def v2 = "v2 in a.b()"
  10. def v4 = "v4 in a.b()"
  11. def g = {
  12. def v0 = "v0 in closure g"
  13. def h = {
  14. //function b里面已经定义v4 = "v4 in a.b()"所以下面这行
  15. //报错:The current scope already contains a variable of the name v4
  16. //def v4 = "v4 in closure h"
  17. }
  18. }
  19. def c = {
  20. //下面的这行代码报错:The current scope already contains a variable of the name v1
  21. //def v1 = "v1 in closure c"
  22. println v1
  23. println owner
  24. println this
  25. //下面这行定义v5变量正常,输出的结果也是:v5 in closure c
  26. def v5 = "v5 in closure c"
  27. println v5//v4
  28. println va
  29. }
  30. println "***" + c.toString() + "***"
  31. c()
  32.  
  33. return "b func"
  34. }
  35.  
  36. def d = {
  37. println v1;
  38. println v2;
  39. println v4;
  40. def v5 = "v5 in closure d"
  41. println v5
  42. }
  43.  
  44. def e = {
  45. def v1 = "v1 in closure e"
  46. def f = {
  47. //下面这行代码报错:The current scope already contains a variable of the name v1
  48. //def v1 = "v1 in closure f"
  49. println v1
  50.  
  51. //下面这行就没错,因为闭包e的v2是在后面定义的
  52. def v2 = "v2 in closure f"
  53.  
  54. //下面这行报错,v3在f里面不可见
  55. //println v3
  56.  
  57. def vf = "vf in closure f"
  58. }
  59. f()
  60. def v2 = "v2 in closure e"
  61. def v3 = "v3 in closure e"
  62.  
  63. //在闭包e里面vf不可见
  64. //println vf
  65. }
  66. }
  67. def test(x) {
  68. println "func test start --- x:" + x
  69. def v1 = 1000
  70. def v2 = 2000
  71. def v3 = 3000
  72.  
  73. x()
  74. println "func test--- end:"
  75. }
  76. test(new a().d)
  77. println "--------------"
  78. //println new a().v4
  79. println new a().b()
  80. new a().e()
  81.  
  82. /*
  83. 通过上面的测试代码可以看出:
  84. 1.在闭包a里面定义的闭包b,那么b中定义的变量不能和和闭包a里面定义的变量名字相同.
  85. 2.在函数a里面定义的闭包b,那么b中定义的变量不能和和函数a里面定义的变量名字相同.
  86. 3.由此也可以推导出:在函数a里面定义闭包b,在闭包b里面定义闭包c,那么c中定义
  87. 的变量也不能和函数a中定义的变量名字相同,对于任意多层闭包嵌套也是如此
  88. 在闭包里面的符号查找方面:
  89. 首先在闭包里面查找,如果闭包里面没有定义,则有两种情况(假设delegate策略是Closure.OWNER_FIRST,其它策略是一样的):
  90. 1.如果这个闭包的外层是函数,则现在函数里面查找,如果函数里面也没有定义,则进入delegate策略即在owner里面查找,
  91. 如果owner里面没有,则在delegate里面查找,ruguo delegate里面没有就报错
  92. 2.如果这个闭包没外层不是函数,则直接进入delegate策略即在owner里面查找,如果owner里面没有,则在delegate里面查找
  93. 如果delegate里面没有就报错.
  94.  
  95. */

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. 数据库【mysql篇】学习笔记

    Windows服务 -- 启动MySQL    net start mysql-- 创建Windows服务    sc create mysql binPath= mysqld_bin_path(注意 ...

  2. Django 数据库读写分离 分库分表

    多个数据库 配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BA ...

  3. Luogu P5283 [十二省联考2019]异或粽子

    感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问 ...

  4. JAVA如何利用Swiger获取Linux系统电脑配置相关信息

    最近开发java应用程序,涉及到获取Linux服务器相关配置的问题,特地网上搜寻了下,采用Swiger包可以直接获取,再次小结一下,以便于以后能方便使用,也便于其他童鞋们学习. 推荐大家参考链接:ht ...

  5. MVC中使用viewmodel

    新建一个类在类中写 public class DataViewmodel { public List<users> usersmodel { get; set; } public List ...

  6. Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤

    Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述——    隐鹤 1. 引言 Excel任务窗格是一个可以用来存放各种常用命令的侧边窗口(准确的说是一个可以停靠在类名为x ...

  7. laravel 多条件查询

    select * from homework where (id between 1 and 10 or id between 50 and 70) and complete = 1 and (tit ...

  8. axios拦截http拦截

    一,判断登录页面 const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: ' ...

  9. Activiti6-FormService(学习笔记)重要

    设置流程定义文件: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=&qu ...

  10. python高级编程笔记一 正则表达式

    事例