如何在 CF10 中确定闭包变量的范围?

2024-05-15

引自Adobe ColdFusion 10:使用闭包文档 http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d31851842acbba1353e848b35-8000.html:

function helloTranslator(String helloWord) 
{ 
    return function(String name) 
    { 
        return "#helloWord#, #name#"; 
    }; 
}

如何确定范围helloWord and name正确地在回程线上吗?他们都在吗Arguments范围?如果是这样的话,它们一定是独一无二的吗?

The 闭包和函数 http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d31851842acbba1353e848b35-7ffa.html#community部分还提到,除了已经很长的范围搜索之外,还有 4 个范围:

在闭包中,以下是搜索无作用域变量的顺序:

  1. 关闭的local scope
  2. 关闭的arguments scope
  3. 外部函数的local范围(如果有)
  4. 所有者函数local范围(如果有)
  5. ColdFusion 内置范围

如果我的范围是'local.',它会只搜索 1,还是 1,3 & 4?

顺便说一句,我了解封闭和外部。谁是Owner?

谢谢


Update:提交的增强请求:


    function helloTranslator(String helloWord) 
    { 
      return function(String name) 
      { 
        return "#helloWord#, #name#"; 
      }; 
    }

Here helloWord and name无法确定范围。有一个隐含的Owner范围“函数内定义的闭包”是声明(父)函数的局部范围,其中存在这些变量。因此,这些变量必须是唯一的(在函数内)才能从闭包访问。

在闭包中,搜索无作用域变量的过程如下:

  1. 闭包的局部作用域
  2. 闭包的参数范围
  3. 外部/所有者函数的本地范围(如果可用)
  4. 外部/所有者函数的参数范围(如果可用)
  5. 变量范围(在创建闭包时可用)
  6. ColdFusion 内置范围

如果某物的范围为Local,在闭包中,它只会在 1 中搜索。 AFN 没有办法直接作用于 3,4。

附注如前所述Owner作用域只不过是一个隐式作用域,它指向创建闭包时父/外部函数的本地作用域的缓存副本。

附注您可以使用 ColdFusion 记录增强 https://bugbase.adobe.com/明确这一范围。

不同范围的示例如下。运行这个,您将了解闭包如何使用不同的作用域。

any function exampleClosureForm(arg1){

    function x(innerArg1,innerArg2){
        //var arg1= 50;// will hide parent's arg1 if declared
        writedump(arguments);// would dump closure's
        writedump(local);// would dump closure's
        writedump(session.a); // would be same session shared across
        writedump(arg1); // would dump parents argument arg1
        return session.a-- + innerArg1+innerArg2+arg1--;// decrementing to see its behavior for successive call
    };  
    writeoutput(x(1,2));
    writedump(arguments,"browser","html",false,"function");// would dump parent's
    writedump(local,"browser","html",false,"function");// would dump parent's
    arg1 = -100; // since closure is sharing the parent's variable, this change should get reflected
    return x;
}
session.a = 10;
a = exampleClosureForm(10);
writeoutput("now the calls <br>"); 
writeoutput(a(innerArg1=5,innerArg2=5)); 
writeoutput("<br>");
// with argumentcollection
argsColl = structNew();
argsColl.innerArg1= 1;
argsColl.innerArg2= 3;
writeoutput(a(argumentCollection = argsColl));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 CF10 中确定闭包变量的范围? 的相关文章

  • Clojure:让作用域和函数返回值

    我在弄清楚如何使用 let 形式时遇到了一些麻烦 在下面的示例中 我想在本地绑定值 cols 以便稍后在函数中处理它 然而 我注意到 如果我使用 let 函数 sel opt tmp 将返回 nil 值而不是列表 defn sel opt
  • 使用 cfchart 标签在单个饼图中显示多个查询的数据

    请考虑以下代码 现在我的代码中有以下代码 cfm页面内的 tag DataSource xx xx x xx Name of the database sgemail Name of the relevant column event vc
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • 全局变量声明

    我是 Python 的初学者 并且已经处理过全局变量的概念 当我以为我理解了这个概念时 我看到了一段简短的代码 证明我错了 message global def enclosure message enclosure def local g
  • 使用 cfdocument 时仅将页脚添加到最后一页

    我正在使用创建多页文档cfdocument 使用动态文本创建 因此可以有任意数量的页面 甚至一页 我可以用
  • ColdFusion - 获取下一个要运行的计划任务

    该线程对于查找计划任务的下一个运行时间很有用 如何找到计划任务的下一次运行时间 https stackoverflow com questions 10740297 how do i find out the next run time f
  • 将 Topaz 签名字符串(十六进制)转换为图像

    我正在尝试将黄玉签名板集成到我的 ColdFusion 应用程序中 我想从 pad 捕获签名 将其转换为 ColdFusion 可以在浏览器中显示的格式并保存到磁盘 使用他们的文档 我能够以十六进制格式检索捕获的签名 我认为 我正在关注他们
  • 如何获得一列中的最大数量?

    我一直在尝试找到一个如何获取列中最大数字的示例 我想做的是 找到 TABLE A 中的最大列数 点 列 例如 我想输出这个 MAX 数字
  • 为什么使用闭包进行赋值而不是直接将值赋给键?

    我当时正在看在 7 10 他添加了一个数据库依赖项并使用闭包来分配值 我的问题是为什么不直接使用直接赋值 我的意思是不这样做 container db capsule 相当于这样做 container db function contain
  • 更改方法中变量的值,Java [重复]

    这个问题在这里已经有答案了 我有一个关于更改 Java 方法中变量值的问题 这是我的代码 public class Test public static void funk int a int b b 0 b 0 2 a b 0 5 pub
  • Tomcat:Java 静态变量作用域、应用程序范围还是会话范围?

    java 静态变量是否在使用相同 web 应用程序的所有会话之间共享 或者每个会话都有自己的静态变量版本吗 换句话说 Tomcat 是为每个会话创建一组新的类 还是为整个 Web 应用程序创建一组新的类 Tomcat 创建一个ClassLo
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • 使用 Maven 进行 Coldfusion 项目

    我必须处理相当丑陋且大量的 ColdFusion 代码 到目前为止 这些代码都是通过在生产服务器上直接修改来维护的 不要问 我设法清除它的重复和备份并将其放入 Subversion 现在我需要选择一个 make 系统以便能够将其放入持续构建
  • 从 array_map 匿名函数内部调用类方法

    我正在尝试从一个对象中调用我的对象的方法之一array map匿名函数 到目前为止 我收到了预期的错误 致命错误 不在对象上下文中时使用 this 我知道为什么我会收到此错误 我只是不知道如何实现我想要的目标 有人有任何建议吗 这是我当前的
  • 使用 Coldfusion 11 的 CFdirectory,文件名中存在非 ASCII 字符问题

    我有一个类似的问题 ColdFusion CFDirectory 和法语 https stackoverflow com questions 1715632 coldfusion cfdirectory and the french从而没有
  • 异常处理的范围规则是什么? [复制]

    这个问题在这里已经有答案了 我偶然发现了一个有趣的场景这个问题 https stackoverflow com q 69464430 6045800 考虑以下简单示例 try 1 0 error error except Exception
  • JavaScript:全局范围

    现在 我创建一个包含很多函数的 js 文件 然后将其链接到我的 html 页面 这是可行的 但我想知道在我的页面中插入 js 并避免与范围冲突的最佳方法 良好实践 是什么 谢谢 您可以将它们包装在匿名函数中 例如 function 但是 如
  • 访问父函数中定义的变量

    有没有办法访问 foo从内部inner function outer foo function inner print foo inner outer PHP 在 PHP 5 3 中 你可以这样做 function outer foo in
  • 如何绕过 CF8 编码不可打印字符中的 SerializeJSON?

    SerializeJSON 创建具有不可打印字符 即 ASCII 21 的 JSON 这是无效的 JSON 我该如何解决这个问题 删除不可打印字符的正则表达式会起作用吗 什么正则表达式会删除不可打印的字符 嗯 这个简单的解决方案是为 cff
  • 原型组件的 Spring 事件处理

    假设我有两个组件 X 和 Y 其中 X 是单例 而 Y 不是 当我发布XUpdateEvent时 没有问题 我可以捕获该事件 但是 对于 YUpdateEvent 我无法捕获事件 Spring 为每个触发的事件创建新实例 而不是使用已经创建

随机推荐