Можете ли вы изменить область действия нескольких переменных одновременно в Coldfusion?

#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.