2013-06-27 32 views

Trả lời

7

Sự khác biệt xảy ra nếu hàm này đệ quy. Trong trường hợp đầu tiên, tên "hàm" không nằm trong phạm vi bên trong phần thân hàm nên bất kỳ cuộc gọi đệ quy nào thực sự tham chiếu đến phiên bản "myFunction" nằm trong phạm vi trước khi bạn xác định biến cục bộ của bạn (hầu hết các lần này một biến toàn cầu trống).

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

Để có thể viết hàm đệ quy với mô hình chuyển nhượng, có một điều bạn có thể làm là predeclare biến:

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

biến Predeclaring cũng sẽ xảy ra là cách duy nhất để xác định một cặp chức năng địa phương lẫn nhau đệ quy:

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

Sự khác biệt là according to the manual:

0.123.

Tuyên bố

local function f() body end 

dịch để

local f; f = function() body end 

không

local f = function() body end 

(Điều này chỉ làm cho một sự khác biệt khi cơ thể của hàm chứa tham chiếu đến f.)

Lý do chính là phạm vi của biến (nơi biến được hiển thị) bắt đầu SAU câu lệnh cục bộ, và nếu hàm đệ quy, nó sẽ không tham chiếu, mà là địa phương trước đó hoặc tên toàn cục có tên là f.

Các vấn đề liên quan