joe 发表于 2022-6-17 16:03:29

lua 词法作用域(Lexcial Scope)

函数bar执行,val的值是1还是2呢?val = 1

function foo()
    print(val)
end

function bar()
    local val = 2
    foo()
end

bar()


具体解释可以参考:https://zhuanlan.zhihu.com/p/452689653


joe 发表于 2022-6-17 16:06:10

上面这段代码中,一共有三个作用域:

全局作用域
foo的函数作用域
bar的函数作用域
这很好理解,但foo里访问了作用域中没有的变量value。为了得到这个变量的值就要去 foo的上层作用域查询,那么 foo 的上层作用域是什么呢?是它 调用时 所在的 bar 作用域?还是它 定义时 所在的全局作用域?

这个问题的关键就是Lua中的作用域类型----词法作用域。词法作用域意味着函数被定义的时候,它的作用域就已经确定了,和拿到哪里执行没有关系,因此词法作用域也被称为 “静态作用域”。

因为Lua是静态作用域,所以foo定义的时候就应该知道它的作用域,和在哪执行的没有关系,所以打印的值是1。如果是动态作用域,那上面代码运行的结果就是bar作用域中的2。Linux 中用的 bash 脚本语言,就是动态作用域。
页: [1]
查看完整版本: lua 词法作用域(Lexcial Scope)