#coldfusion #coldfusion-9
#coldfusion #coldfusion-9
Вопрос:
Хотя это возможно и не выдает ошибку, я хотел бы знать, одобрена ли практика изменения области видимости нескольких переменных в одной строке, как это:
<cfset VAR var1 = var2 = var3 = ''>
Я был бы признателен за все идеи и мнения, особенно если они сопровождаются документацией в качестве аргумента поддержки. Я знаю, что это работает без выдачи ошибки, но я не могу найти конкретную документацию, в которой говорится, будет ли она охватывать переменную или просто объявляет значение.
Спасибо!
Комментарии:
1. Кстати: Простой способ протестировать это — сбросить локальную область видимости функции: CF9 /
#Local#
CF8/#getPageContext().getActiveFunctionLocalScope()#
Ответ №1:
Черт возьми, да, вы можете сделать это в CF9:
<cfset var a = var b = c = d*5>
Вот документация, в которой приводится этот пример. В этом случае я предполагаю, что переменные c
и d
уже были определены ранее в функции.
Итак, вам нужно повторить var
ключевое слово для каждой переменной, и в вашем случае это приведет к:
<cfset VAR var1 = VAR var2 = VAR var3 = ''>
Ответ №2:
Как все говорили, вам нужно ограничить ваши переменные с помощью var
или local
. Также, как сказал @Ben, вы не можете изменять переменные области видимости, как у вас. Я бы предложил использовать локальную область видимости и сделать что-то вроде следующего:
<cfscript>
var val = 'some value'
local = {
var1 = duplicate(val),
var2 = duplicate(val),
var3 = duplicate(val)
};
</cfscript>
Это, на мой взгляд, самый быстрый способ достичь того, что вы, кажется, делаете. Я использую функцию duplicate только для того, чтобы при использовании комплексной переменной в качестве значения val (struct, array и т.д.) У вас не возникло проблем со ссылками.
Ответ №3:
<cfset>
не охватывает переменные.
Для правильной области видимости переменных требуется var
ключевое слово
<cfset var someVariable = 1>
В противном случае переменные будут созданы, но назначены области видимости по умолчанию. Область действия по умолчанию зависит от контекста и от того, о какой версии CF мы говорим.
Для методов CFC:
- CF9 ->
LOCAL
область видимости - CF8 ->
VARIABLES
область видимости
Из-за правил области видимости в CF9 var
ключевое слово на самом деле не требуется. Переменные могут быть добавлены в LOCAL
область видимости напрямую и в любое время ( <cfset LOCAL.foo = "bar"
). Нет необходимости определять их заранее.
Ответ №4:
Полагаю, мне следует начать с указания на то, что ваш код не изменяет область видимости переменных, он просто устанавливает их значения. Вам нужно использовать ключевое слово VAR (или LOCAL scope в CF9), чтобы указать, что переменные должны иметь область видимости VAR.
Кроме того, назначение цепочки работает не во всех версиях CF. Мое рабочее место все еще находится на версии 6.1, и это выдает ошибку.
Наконец, если я правильно помню, если вы используете оператор присваивания, как указано выше, var1 и var2 равны true, поскольку результат операции присваивания равен true, если не произошло ошибки. (кто-нибудь, поправьте меня, если я ошибаюсь, поскольку я не могу протестировать это на работе, поскольку мы на 6.1)
В любом случае, возвращаясь к вашему вопросу, я никогда не связываю назначение или область видимости. Во-первых, я думаю, что отдельные назначения понятнее. во-вторых, это работает не во всех версиях. Поэтому я бы предположил, что предпочтительнее отдельные назначения.
Комментарии:
1. Мне тоже не нравится объединение в цепочки, но быстрый тест с CF9 показывает, что все переменные равны пустой строке. Однако
var2
иvar3
помещаются в общуюvariables
область видимости (не локальную функцию).
Ответ №5:
Я видел, как люди просто создают структуру var и определяют ваши переменные как ключи для структуры. Таким образом, вам не нужно постоянно использовать var. Например.:
<cfset var local = structNew() />
<cfset local.var1 = "" />
<cfset local.var2 = "" />
Это полезно для тех, кто использует ColdFusion Server 8 и ниже и застрял в области видимости var.