2013-06-27 4 views

risposta

7

La differenza si verifica se la funzione è ricorsiva. Nel primo caso, il nome della "funzione" non è ancora all'interno del corpo della funzione, quindi qualsiasi chiamata ricorsiva si riferisce effettivamente a qualsiasi versione di "miaFunzione" che era in ambito prima di definire la variabile locale (la maggior parte delle volte questa misura una variabile globale vuota).

fac = "oldvalue" 
local fac = function() 
    print(fac) --prints a string 
end 

Per essere in grado di scrivere funzioni ricorsive con il modello di assegnazione, una cosa che puoi fare è predichiarare la variabile:

local myFunction 
myFunction = function() 
    -- ... 
end 

variabili Predeclaring avviene anche per essere l'unico modo per definire una coppia di mutuamente ricorsive funzioni locali:

local even, odd  
even = function(n) if n == 0 then return true else return odd(n-1) end end 
odd = function(n) if n == 0 then return false else return even(n-1) end end 
3

La differenza è che according to the manual:

0.123.

La dichiarazione

local function f() body end 

traduce

local f; f = function() body end 
non

a

local f = function() body end 

(questo fa solo una differenza quando il corpo della funzione contiene riferimenti a f.)

Il motivo principale è che l'ambito di una variabile (dove la variabile è visibile) inizia DOPO l'istruzione locale e, se una funzione era ricorsiva, non si farebbe riferimento a se stessa, ma a una precedente locale o globale denominata f.