2013-12-13 1 views
3

Извините, это лучшее название, которое я могу придумать.ColdFusion 10 не вызывает никаких ошибок, но ColdFusion 8 делает

Я надеюсь, что кто-то здесь может дать мне объяснение этому поведению. Мой работодатель просто решил обновить 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 терпит неудачу, либо потому, что «местный» является зарезервированным словом в 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> 
+1

Я согласен с тем, что CF 10 должен выбросить ошибку, но я думаю, что это должно вызвать другую ошибку. Я думаю, что это вызовет ошибку при создаваемой переменной. ColdFusion 9 представила область «local», и я думаю, что происходит то, что на самом деле создается переменная с именем «local», но при попытке установить «local.a» она устанавливается в области «local» а не переменной с именем «local». Поэтому 'local.a' на самом деле существует, но он находится в области« local », а не в переменной« local ». Имеют смысл? –

+0

Также обратите внимание, что во второй раз, когда вы устанавливаете 'local', нет' var', поэтому переменная не будет локальной для этой функции. –

+2

Как я понимаю, как только вы var'd переменную один раз, она локальна для функции независимо от того, сколько раз она меняет ее значение. –

ответ

6

Несколько вопреки того, что любой нормальный человек будет думать, здравый смысл, ColdFusion 9 (и, соответственно, 10) было жестко, чтобы проигнорировать это заявление:

local = structNew(); 

Или:

local = {}; 

Это должно обеспечить «обратную совместимость» с людьми, которые традиционно использовали local в качестве псевдо-локальной области в более старых версиях CF.

Adobe сделала это нарочно, поверьте или нет.

Вы можете продемонстрировать это, запустив этот код на cflive.net:

function f(){ 
    var local = {}; 

    local.a = "set at top"; 

    local = {}; 

    writeDump(var=local); 
} 

f(); 

Railo, благослови их, последовали примеру ColdFusion здесь, ради перекрестной совместимости.

Adobe здесь очень глупая вещь, и теперь мы застряли с ней. Но именно поэтому вы видите то, что видите.

+0

Это было не глупо, это было меньше двух зол. Обновления для программного обеспечения CF или базы данных уже достаточно разрываются. –

+3

Обратная совместимость должна защищать от изменений * на языке *. Не угадывая, как некоторые люди написали свой код. И это «защищает» очень несущественный краевой случай, который в результате приведет к плохо написанному коду. Это было глупо. –

+0

Адам, большое спасибо за ваше объяснение. –

 Смежные вопросы

  • Нет связанных вопросов^_^