Coldfusion范围澄清

Coldfusion范围澄清,coldfusion,scope,coldfusion-9,Coldfusion,Scope,Coldfusion 9,我一直在阅读有关CF作用域的内容,并且对CFC作用域及其含义感到满意(),然而,每当我搜索CF作用域时,它几乎总是在CFC的上下文中引用—因此我希望在CFM页面中对作用域进行一些澄清。我使用的是CF9/10,所以我只对这些版本中作用域的行为感兴趣 CFM页面上有哪些作用域-CFM页面是否存在与其他地方相同的并发问题,或者CFM页面上的变量作用域是否绑定到该特定请求的作用域 如果我在CFM页面中包含行,它将包含在哪个范围内?同一页面上的其他用户访问变量或其他cfm页面访问变量是否存在任何风险 谢谢

我一直在阅读有关CF作用域的内容,并且对CFC作用域及其含义感到满意(),然而,每当我搜索CF作用域时,它几乎总是在CFC的上下文中引用—因此我希望在CFM页面中对作用域进行一些澄清。我使用的是CF9/10,所以我只对这些版本中作用域的行为感兴趣

  • CFM页面上有哪些作用域-CFM页面是否存在与其他地方相同的并发问题,或者CFM页面上的变量作用域是否绑定到该特定请求的作用域

  • 如果我在CFM页面中包含行
    ,它将包含在哪个范围内?同一页面上的其他用户访问变量或其他cfm页面访问变量是否存在任何风险


  • 谢谢

    除了“THIS”之外,几乎所有的作用域都可以在CFM页面中找到

    CFM页面中声明的非作用域变量可以直接调用,也可以使用变量作用域前缀调用

    例如:

    
    
    也可以写成

    <cfset VARIABLES.varA = 'something' />
    
    
    
    据我所知,除非您创建一个单例(仅适用于CFC),并将其置于应用程序范围内,否则您永远不会冒险与其他用户共享变量。如果不小心在CFC函数中正确地确定局部变量的范围,这也是有效的

    在CFM页面上,每个用户请求都有自己的处理线程,不会与其他用户请求交叉。因此,变量仅绑定到该特定请求的范围

    如果希望所有请求页面的用户都使用变量,可以将其放入应用程序范围

    我不太明白你的第二个问题。如果你能详细说明的话,也许我可以补充我的答案

    更新

    此代码将帮助您回答这两个问题

    <cfscript>
        function a(){
            _a = 20;
            WriteOutput("Inside function:"&variables['_a']);
            WriteOutput("Inside function:"&variables['_b']);
        }
        _b = 30;
        a();
        WriteOutput('outside function:'&variables['_a']);
    </cfscript>
    
    
    函数a(){
    _a=20;
    WriteOutput(“内部函数:”&变量[''u a']);
    WriteOutput(“内部函数:”&变量[''u b']);
    }
    _b=30;
    a();
    WriteOutput('外部函数:'&变量[''u a']);
    
    输出

    内部功能:20
    内部功能:30
    外部功能:20

    ,很好地解释了可用范围

    如果您足够仔细地观察,您将发现更多关于如果您不确定变量范围会发生什么的信息。其要点是,您的代码将成功运行,但效率较低。原因是ColdFusion将尝试找到正确的作用域。它按指定的顺序检查某些作用域。那个订单太多了,我就是找不到

    关于你的第二个问题

    <cfset myVar = 10>
    
    
    
    将myVar变量放入variables范围

    关于一个用户更改影响其他用户的变量,我认为唯一有风险的范围是应用程序范围。然而,在现代浏览器中,单个用户可能会弄乱自己的会话变量。我已经看过了

    另一种可能会无意中更改变量的方法是使用函数。如果要使变量保持函数的局部性,则必须在实例化变量时使用var关键字。在CF的更高版本中,有一个本地作用域可以完成相同的任务


    就个人而言,除了变量范围之外,我对所有变量都进行了范围界定

    您所说的关于变量溢出到表单范围的内容是不正确的。运行此代码
    可以正确地获得
    表单.myvar='b'
    。如果您尝试执行类似于
    的操作,那么它将搜索
    表单
    url
    范围,但我从来没有看到过其他方法。这一点很好。我想我应该在写之前测试它。另请看@DanBracuk如果你看到我对另一个答案的评论,这似乎表明变量范围在cfm页面中不是线程安全的?很酷,谢谢-2进一步的问题:1)如果我在cfm的变量范围中定义了什么,除非我将该范围作为参数传递,否则该变量范围在其他任何地方都不可用?2) 如果我有一个带有函数的cfm,该函数是否可以访问cfm页面变量范围?非作用域函数变量是否默认为cfm页面变量范围?另外,我们刚刚读到的这篇文章似乎表明,对同一cfm页面的两个请求将访问相同的变量范围?如果这是真的,我假设变量作用域即使在普通cfm代码中也不会是线程安全的?@rhinds我没有遇到过竞争条件。我会检查一下,看看这是不是一个bug或是想要的特性。@rhinds我无法复制博客中显示的内容。顺便说一句,这已经在讨论你的另一个问题。因此,我将在那里继续。
    <cfset myVar = 10>