【问题标题】:ColdFusion 10 does not throw any errors but ColdFusion 8 doesColdFusion 10 不会抛出任何错误,但 ColdFusion 8 会
【发布时间】:2013-12-13 12:36:18
【问题描述】:

对不起,这是我能想到的最好的标题。

我希望这里有人能给我解释一下这种行为。我的雇主刚刚决定将 CF 8 升级到 CF 10(是的,我知道)。但是,有些服务器在 CF 10 上,有些在 CF 8 上。我知道它不应该是这样的;但这不在我的控制范围内。 无论如何,我有以下代码。它在 CF 8 中中断,但在 CF 10 中可以正常工作。在 CF 8 中,据说元素 a 没有在本地定义,这是意料之中的,我对此没有问题。毕竟,local 被声明了两次,而第二次没有定义 a。

但在 CF 10 中,不会生成错误,并且函数会返回 local.a。对我来说,CF 10 应该抛出错误,原因与 CF 8 失败的原因相同,或者因为“local”是 CF 10 中的保留字(“local”是在 CF 9 中引入的)。为什么 CF 10 没有报错?

<cfcomponent name="myComponent">
<cffunction name="myFunction" returntype="Numeric">
<cfscript>
var local = StructNew();
local.a = 1;
</cfscript>

<cfset local = StructNew()>

<cfif local.a is 0>
<!--- do something --->
</cfif>

<cfreturn local.a>
</cffunction>
</cfcomponent>

【问题讨论】:

  • 我同意 CF 10 应该抛出一个错误,但我认为它应该抛出一个不同的错误。我认为它会在正在创建的变量上引发错误。 ColdFusion 9 引入了local 范围,我认为实际上正在创建一个名为“local”的变量,但是,当您尝试设置local.a 时,它被设置在local 范围而不是名为 local 的变量。所以local.a 确实存在,但它在local 范围内,而不是名为local 的变量中。有意义吗?
  • 另请注意,第二次设置local 时没有var,因此该变量不会是函数的本地变量。
  • 据我了解,一旦你对一个变量进行了一次 var'd,无论它改变多少次它的值,它都是函数的局部变量。

标签: coldfusion coldfusion-8 coldfusion-10


【解决方案1】:

有点无视任何理智的人会认为的常识,ColdFusion 9(以及相应的 10)已被硬编码以忽略此声明:

local = structNew();

或者:

local = {};

这是为了向那些在旧版本的 CF 中传统上使用 local 作为伪本地范围的人提供“向后兼容”。

不管你信不信,Adobe 是故意这样做的。

您可以通过在cflive.net 上运行此代码来证明这一点:

function f(){
    var local = {};

    local.a = "set at top";

    local = {};

    writeDump(var=local);
}

f();

Railo,保佑他们,为了交叉兼容性,在这里跟随 ColdFusion 的领先。

Adobe 在这里做了一件非常愚蠢的事情,现在我们被它困住了。但这就是为什么你看到你所看到的。

【讨论】:

  • 这不是愚蠢,而是两害相权取其轻。升级到 CF 或数据库软件已经破坏了很多东西。
  • 向后兼容应防止更改语言。不要猜测有些人是如何编写他们的代码的。这“保护”了一个非常无关紧要的边缘情况,无论如何都会导致编写糟糕的代码。这是一件愚蠢的事情。
  • 没有问题。有点奇怪,尼特?
  • 是的,确实很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多