risc-v中文社区

 找回密码
 立即注册
查看: 732|回复: 1

lua 词法作用域(Lexcial Scope)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-6-17 16:03:29 | 显示全部楼层 |阅读模式
函数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


回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2022-6-17 16:06:10 | 显示全部楼层
上面这段代码中,一共有三个作用域:

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

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

因为Lua是静态作用域,所以foo定义的时候就应该知道它的作用域,和在哪执行的没有关系,所以打印的值是1。如果是动态作用域,那上面代码运行的结果就是bar作用域中的2。Linux 中用的 bash 脚本语言,就是动态作用域。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-6 07:08 , Processed in 0.013505 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表