2013-07-26 66 views
2

兩次關閉如何分擔價值?它是如何工作的?什麼是共享的upvalues?

function print_env() 
    print(_ENV) --_ENV is an upvalue 
end 

function foo() 
    _ENV = { print = print, print_env = print_env} --redefine the _ENV upvalue 
    print(_ENV) --prints: 0094CF40 
    print_env() --prints: 0094CF40 
end 

當我打電話print_env()foo()它打印在foo()定義的_ENV,但因爲它們是不同的職能不應及其封閉有不同的upvalues?所以當一個函數修改它的高價時,另一個函數保持不變。或者是_ENV特價?

謝謝

+0

至於我,'foo()'打印兩條相同的線。所有三次出現'_ENV'參考相同的價值。 –

+0

@EgorSkriptunoff我試着用dofile來運行代碼,它在兩個函數中都使用相同的upvalue。但爲什麼會發生? –

+0

我認爲_ENV在這種情況下是塊upvalue而不是函數。 _ENV = ...與_G._ENV = ...相同您可以執行本地_ENV = ...以創建特定函數的upvalue。 – moteus

回答

1

Upvalues是外部局部變量。兩個函數在使用相同的外部局部變量時可以共享upvalues。這是由詞彙範圍確定的。此外,每個塊都會看到名爲_ENV的外部局部變量,該變量用於解析全局名稱。

相關問題