Non-local variable là gì?

Noun Programming
free variable
Biến không cục bộ, biến phi cục bộ

Trong lý thuyết ngôn ngữ lập trình (programming language theory), một biến không cục bộ (non-local variable) là một biến (variable) không được định nghĩa trong phạm vi cục bộ (local scope). Mặc dù thuật ngữ này có thể đề cập đến các biến toàn cục (global variable), nhưng nó chủ yếu được sử dụng trong ngữ cảnh của các hàm lồng nhau (nested function) và các hàm ẩn danh (anonymous function) trong đó một số biến có thể không nằm trong phạm vi cục bộ hoặc toàn cục (global scope). Trong Lua, chúng được gọi là các upvalue của hàm (function).

Hàm lồng nhau

Ví dụ sau trong Python 3, có một hàm lồng nhau bên trong được định nghĩa trong phạm vi (scope) của một hàm khác bên ngoài. Biến x là cục bộ (local) đối với hàm bên ngoài (outer function), nhưng không cục bộ đối với hàm bên trong (inner function) và cũng không phải là toàn cục):


def outer():
    x = 1
    def inner():
        nonlocal x
        x += 1
        print(x)
    return inner

Trong Javascript, tính cục bộ (locality) của một biến được xác định bởi câu lệnh var gần nhất cho biến này. Trong ví dụ sau, x là cục bộ đối với hàm bên ngoài vì nó chứa câu lệnh var x, trong khi hàm bên trong thì không. Do đó, x không cục bộ đối với hàm bên trong:


function outer() {
    var x = 1;
    function inner() {
        x += 1;
        console.log(x);
    }
    return inner;
}

Hàm ẩn danh

Trong ví dụ Haskell theo sau biến c là không cục bộ trong hàm ẩn danh \ x -> x + c:


outer = let c = 1 in map (\x -> x + c) [1, 2, 3, 4, 5]

Learning English Everyday