2014-07-25 63 views
1

我目前正在檢查我所有的函數和組件的unscoped變量。我正在使用名爲varscoper4的工具來檢查所有功能。鑑於下面的代碼,varscoper告訴我,第4行的變量「輸入」在非範圍內。這是真的,我需要範圍變量如果我改變它?Coldfusion和unscoped變量

<cfoutput>#testit(1)#</cfoutput> 
<cffunction name="testit"> 
    <cfargument name="input"> 
    <Cfset input = 3> 
    <cfreturn input> 
</cffunction> 

僅供參考,如果我不改變的功能varscoper4參數變量輸入沒有報告任何無範圍的變量。

<cfoutput>#testit(1)#</cfoutput> 
    <cffunction name="testit"> 
    <cfargument name="input"> 
    <Cfset var output = 3 + input> 
    <cfreturn output> 
</cffunction> 

回答

5

在你的拳頭代碼塊,輸入「無範圍」,但CF將其解釋爲參數範圍。 CF將通過查看優先級順序來始終嘗試找到您未查找到的變量。你可以在這裏找到更多的信息:http://www.learncfinaweek.com/week1/Scopes/

你也可以通過轉儲不同的作用域並查看輸出來查看看起來像什麼。

<cfoutput>#testit(1)#</cfoutput> 

<cffunction name="testit"> 
    <cfargument name="input"> 
    <cfset input = 3> 
    <cfdump var="#variables#" label="variables"> 
    <cfdump var="#arguments#" label="arguments"> 
    <cfdump var="#local#" label="local"> 
    <cfreturn input> 
</cffunction> 

我強烈建議您將varscoper工具的輸出作爲指導,以便您明確定義變量的範圍。在這種情況下,你的第一塊代碼將如下所示。這是爲了清晰和確定您的代碼。

<cfoutput>#testit(1)#</cfoutput> 

<cffunction name="testit"> 
    <cfargument name="input"> 
    <cfset arguments.input = 3> 
    <cfdump var="#variables#" label="variables"> 
    <cfdump var="#arguments#" label="arguments"> 
    <cfdump var="#local#" label="local"> 
    <cfreturn arguments.input> 
</cffunction> 

個人而言,我不喜歡在我的函數和方法中設置或更改參數。我寧願讓它們保持不變,就像你在第二塊代碼中一樣。但即使在那裏,我會明確地範圍的參數,讓你知道它是從哪裏來的 - 即使不是varscoper標記

<cfoutput>#testit(1)#</cfoutput> 

<cffunction name="testit"> 
    <cfargument name="input"> 
    <cfset var output = 3 + arguments.input> 
    <cfdump var="#variables#" label="variables"> 
    <cfdump var="#arguments#" label="arguments"> 
    <cfdump var="#local#" label="local"> 
    <cfreturn output> 
</cffunction> 
在這裏添加

末的事情,如果現在還不清楚的是,VAR作用域把一切INT他本地的範圍。您也可以這樣做,它在功能上等同於前面的代碼塊:

<cfoutput>#testit(1)#</cfoutput> 

<cffunction name="testit"> 
    <cfargument name="input"> 
    <cfset local.output = 3 + arguments.input> 
    <cfdump var="#variables#" label="variables"> 
    <cfdump var="#arguments#" label="arguments"> 
    <cfdump var="#local#" label="local"> 
    <cfreturn local.output> 
</cffunction> 
+1

有關CF查找正確範圍的注意事項。如果你限制你的變量,CF就不用做這個搜索,你的應用程序將會更有效率。記住,你只需要輸入一次範圍。 –

+1

我認爲有關範圍限定的另一個說明是,它可以讓任何開發人員在日後可能需要進入代碼時更容易。函數可能是一個壞例子,因爲它們相當「被包含」了。一個普通的CFM頁面雖然引用#Foo#可能會讓開發人員想知道「Foo」變量進入頁面的意圖是什麼......意思是它應該來自表單,網址,設置在別處等等。 – Snipe656