Dalam scripting, sebuah blok kode adalah tubuh dari sebuah struktur kontrol atau fungsi. Lingkup dari sebuah variabel atau fungsi adalah blok kode yang dapat mengaksesnya, dan dapat bersifat global atau lokal. Semua blok dapat mengakses variabel dan fungsi global. Sebuah blok dapat mengakses variabel dan fungsi lokal di blok induknya, tetapi tidak di blok anaknya.
Variabel dan fungsi memiliki lingkup global secara default, tetapi hampir selalu lebih baik untuk mendeklarasikannya dengan lingkup lokal karena Luau mengakses variabel dan fungsi lokal lebih cepat daripada yang global. Untuk memberikan lingkup lokal pada sebuah variabel atau fungsi, letakkan kata kunci local sebelum namanya saat Anda mendeklarasikannya.
Skrip tidak dapat mengakses variabel atau fungsi global dan lokal di skrip lain. Jika Anda ingin berbagi nilai dan fungsi antar skrip, gunakan ModuleScripts.
local helloWorld = 'Hello World!'
local function printHelloWorld()
print(helloWorld)
end
printHelloWorld() -- Hello World!
- Blok B dapat mengakses variabel lokal di blok A.
- Blok C dapat mengakses variabel dan fungsi lokal di blok A dan B.
- Blok A tidak dapat mengakses variabel dan fungsi lokal di blok B atau C.
- Blok B tidak dapat mengakses variabel lokal di blok C.
Lingkup Global
Setelah Anda mendeklarasikan variabel atau fungsi global, blok kode mana pun dalam skrip yang sama dapat mengaksesnya. Variabel dan fungsi memiliki lingkup global kecuali Anda mendeklarasikannya dengan kata kunci local.
Dalam kode berikut, testVar memiliki lingkup global di dalam fungsi lokal testFunc(). Ketika Luau memanggil testFunc(), ia menetapkan testVar nilai 64. testVar memiliki lingkup global, sehingga fungsi print() di luar testFunc() dapat mengaksesnya dan mencetak 64.
local function testFunc() -- lingkup lokal
testVar = 64 -- lingkup global
end
testFunc()
print(testVar) -- 64Dalam kode berikut, variabel global x dimulai dari 0, meningkat 1 dengan setiap iterasi dari for loop, dan mencetak lagi setelahnya dengan nilai akhir 4.
x = 0 -- Variabel global "x"
for i = 1, 4 do
x += 1
print("Global 'x' = " .. x)
end
print("Global 'x' = " .. x)
--[[ Hasil keluaran:
Global 'x' = 1
Global 'x' = 2
Global 'x' = 3
Global 'x' = 4
Global 'x' = 4
]]Lebih mudah untuk mendeklarasikan variabel dan fungsi global karena Anda tidak perlu mengetik sebanyak itu, tetapi variabel dan fungsi global memiliki kerugian berikut dibandingkan dengan yang lokal:
- Luau mengakses variabel dan fungsi global dengan pencarian hash, sehingga mahal untuk digunakan dalam hal kinerja. Menggunakan variabel global dalam loop yang kritis terhadap waktu dapat membuatnya berjalan lebih dari 10% lebih lambat dibandingkan menggunakan variabel lokal dalam loop yang sama.
- Luau membuang variabel lokal setelah lingkupnya berakhir, mengurangi penggunaan memori.
Lingkup Lokal
Luau hanya dapat mengakses variabel atau fungsi lokal di blok kode tempat Anda mendeklarasikannya. Membuat variabel dengan lingkup lokal memberi Anda kontrol yang lebih ketat tentang kapan dan di mana nilainya berubah.
Dalam kode berikut, fungsi testFunc() dan variabel testVar memiliki lingkup lokal. Hanya kode di dalam testFunc() yang dapat mengakses variabel testVar. Variabel testVar tidak memiliki nilai di luar testFunc(), sehingga memanggil print(testVar) di dalam testFunc() mencetak nilai testVar, tetapi memanggil print(testVar) di luar testFunc() mencetak nil.
local function testFunc() -- lingkup lokal
local testVar = 64 -- lingkup lokal
print(testVar) -- 64
end
testFunc()
print(testVar) -- nilDalam kode berikut, variabel lokal x memiliki nilai 0 di baris 1. Saat Luau melakukan iterasi melalui for loop, variabel lokal yang berbeda x memiliki nilai 1. Kemudian, Luau mencetak variabel awal x dengan nilai yang tidak berubah 0.
local x = 0 -- Variabel lokal "x"
for i = 1, 4 do
local x = 1 -- Variabel berbeda "x", lokal untuk "for" loop ini
print("Loop 'x' = " .. x)
end
print("Initial 'x' = " .. x)
--[[ Hasil keluaran:
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Loop 'x' = 1
Initial 'x' = 0
]]Variabel dan fungsi const mengikuti aturan lingkup yang sama seperti yang local. Anda dapat mendeklarasikannya di blok mana pun, termasuk di dalam fungsi lain. Untuk informasi lebih lanjut tentang const, lihat Variabel const.
Capture
Setelah Anda mendeklarasikan dan menetapkan variabel lokal, Anda dapat membacanya di tingkat lingkupnya dan fungsi-fungsi yang lingkupnya terkurung oleh lingkup yang sama yang berisi variabel lokal tersebut. Teknik ini dikenal sebagai capturing.
Dalam kode berikut, fungsi f menangkap variabel lokal x. Variabel x di f() adalah sebuah upvalue.
local x = 5
local function f()
print(x)
end
f() -- 5
print(x) -- 5Shadow
Setelah Anda mendeklarasikan dan menetapkan variabel lokal, Anda dapat membacanya di tingkat lingkupnya dan tingkat lingkup keturunannya. Jika Anda mendeklarasikan ulang dan menetapkan variabel di tingkat lingkup keturunan, maka Anda membuat variabel lokal baru dengan nama yang sama tetapi nilai yang berbeda dari penugasan sebelumnya. Variabel lokal baru tidak mempengaruhi variabel lokal dari penugasan sebelumnya. Teknik ini, yang dikenal sebagai shadowing, membantu Anda menggunakan kembali nama variabel tanpa menggunakan kembali nilainya.
Dalam kode berikut, Luau meng-shadow variabel x. Variabel x di f() adalah variabel shadow.
local x = 5
local function f()
local x = 7
print(x)
end
f() -- 7
print(x) -- 5Anda juga dapat mendeklarasikan ulang variabel lokal tanpa menetapkan nilai padanya sehingga Anda dapat menetapkan ulang variabel di tingkat lingkupnya dan tingkat lingkup keturunannya. Mendeklarasikan ulang variabel lokal tanpa menetapkan nilai padanya mengatur nilainya menjadi nil.
Dalam kode berikut, Luau meng-shadow variabel lokal fruitName di fungsi getFruitByColor(). Fungsi tersebut mendeklarasikan ulang fruitName sebagai variabel shadow baru dan mengatur nilainya menjadi nil. Fungsi tersebut memiliki tingkat lingkup keturunan, sebuah for loop, yang menetapkan nilai pada fruitName. Setelah loop for, fungsi tersebut mengembalikan variabel shadow fruitName. Sepanjang fungsi tersebut, fruitName adalah variabel lokal yang sama yang tidak menimpa variabel lokal fruitName yang awal.
local fruitName = "Chocolate"
local fruitTable = {
Lemon = "Yellow",
Apple = "Red",
Orange = "Orange"
}
local function getFruitByColor(color)
local fruitName
for key, value in fruitTable do
if value == color then
fruitName = key
end
end
return fruitName
end
local fruit = getFruitByColor("Yellow")
print(fruit) -- Lemon
print(fruit .. ", not " .. fruitName) -- Lemon, not Chocolate