CFC中的cfscript函数默认输出为false吗?

9

我曾认为在cfscript中定义的CFC方法默认情况下output=false,但是当我在cfcexplorer.cfc中打开CFC时(直接在浏览器中打开CFC),它显示输出:已启用。

cfcexplorer.cfc的Bug?

3个回答

19

简短回答: 没有关系。

cfscript 不会输出任何内容,除非你在其中显式调用 writeOutput()。这包括 cfscript 中的函数以及任何不在函数内的 cfscript 代码。

这与 CF 标签的语法不同,默认情况下,标签之间至少输出空格。在 cfscript 中,你写的任何文本都会被 CFML 引擎编译。在 CF 标签中,你写的任何文本都将被写入输出缓冲区并发送到浏览器。

详细回答: 这与不指定输出属性是相同的。

cfscript 块不会输出任何内容。任何标签块(除非包含在 cfsilent 中)如果没有内容将输出空格。即使 cffunctions 也会输出,但如果设置了 output 属性为 false,则输出会被丢弃。

Peter Boughton 的答案核心是正确的。它既不包含 cfsilent 也不包含 cfoutput。 输出不是被禁止的,但除非显式执行,否则不会发生。

你始终可以将基于标签的 cffunction 与脚本组合起来,以获得最佳效果。例如...

<cffunction name="x" output="false" access="package">
    <cfargument name="y" type="string" required="false" default="YY" />
    <cfscript>
        var someValue = y & "something";
        writeOutput("test"); // this will not be written
        return someValue;
    </cfscript>
</cffunction>

这让你可以在 cffunction 标签上指定输出和访问,同时允许参数是可选的(cfscript 函数无法做到这一点),然后用 cfscript 填充其主体部分,包括变量声明和函数返回值。

当然,对于该函数,如果您移除 output 属性或将其更改为 true,它会在返回之前输出 "test"。


1
在CF9中,cfscript中定义的函数可以有可选参数。请参阅在CFScript中定义组件和函数 - Jared Beck
遗憾的是,这并不正确。尝试在cfscript函数中对ORM结果运行SerializeJSON(),你会看到3行空格。在output='no'cffunction中,没有空格。 - Owen Allen
修正 - 您可以在 cfscript 函数中设置 output = "no" 来消除此行为。 - Owen Allen
1
输出 = "真" 输出 = "假" // 输出未指定 所有行为不同 - James A Mohler

4

cfscript函数就像一个奇怪的猴子。它们有点两者兼备。你不能指定它们是output="false",但在使用writeOutput()之前它们就是输出为false的,但是cfcexplorer报告它们为output="true"。我认为这是一个奇怪的问题,CFML咨询委员会正在关注。


我认为这是正确的答案,但有人可以确认一下吗?谢谢。 - Henry
实际上,我会说彼得·博顿的回答和我的回答都更正确。 - Nathan Strutz

1

我并不完全确定,但我的猜测是,在这方面脚本函数与标签相同 - 默认值既不是也不是。

为设置属性,以下是情况:

  • 等价于将函数包装在中。
  • 等同于将函数包装在中。
  • 将其保留为默认值(未定义)等同于标准代码,既不用也不用进行包装。

然而,我几乎从不使用,这可能并非事实 - 我们必须等待其他人来确认或更正这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接