JavaScript和Lua之间的闭包差异
2013-10-8 6:56:19
收藏:0
阅读:122
评论:1
为什么这两段代码在Javascript和Lua中表现不同呢?
Lua代码:
function main()
local printFunctions={}
local i,j
for i=1,10 do
local printi = function()
print(i)
end
printFunctions[i]=printi
end
for j=1,10 do
printFunctions[j]()
end
end
main()
Javascript代码:
function main()
{
var printFunctions=[]
var i,j;
for(i=0;i<10;i++)
{
var printi = function()
{
console.log(i);
}
printFunctions[i]=printi;
}
for(j=0;j<10;j++)
{
printFunctions[j]();
}
}
main()
在Lua代码示例中,打印出了0 1 2 3 4 5 6 7 8 9,而在Javascript代码示例中,输出了10 10 10 10 10 10 10 10 10 10。有没有谁能解释一下Javascript和Lua中闭包之间的差异是如何导致这种情况发生的?我来自Javascript背景,所以请重点关注Lua方面。
我在我的博客中试图解释这个问题,但我不确定我的解释是否正确,所以任何澄清都将不胜感激。
编辑
谢谢大家,现在我明白了。这个略微修改过的Lua代码以预期的方式打印出10,10,10,10,10,10,10,10,10,10:
function main()
local printFunctions={}
local i,j,k
for i=1,10 do
k=i
local printi = function()
print(k)
end
printFunctions[i]=printi
end
for j=1,10 do
printFunctions[j]()
end
end
main()
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
以下是翻译:
这很简单:
Lua 的
local变量的作用域仅限于最近的do-end块,而使用var声明的 JavaScript 变量的作用域限于最近的函数边界。通过将闭包放置在函数中的各自的范围中,可以解决作用域问题。关于您关于
local i, j在外部作用域的问题,Lua 中的 for 循环语句创建了在块作用域中使用的计数器的作用域,即使在外部作用域中有变量声明也是如此。文档说明(参考)如下:这意味着
var的初始化是在 for 循环作用域中进行的,因此将local i, j放置在外部作用域中没有效果。在文档中提供了 Lua 的 for 语句的等价物。do local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3) if not (var and limit and step) then error() end while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do local v = var block var = var + step end end但是,JavaScript 的 for 语句有很大的不同(参考):
由于 for 循环的声明与任何普通变量声明相同,因此它相当于将其放置在循环外部,这与 Lua 的 for 循环工作方式有很大的区别。 ECMAScript 的下一个版本(ES6)计划引入
let关键字,该关键字在 for 循环中将具有与 Lua for 循环相似的含义:for (let i = 0; i < 10; ++i) setTimeout(function () { console.log(i); }, 9); // 0,1,2,3,4,5,6,7,8,9 for (var i = 0; i < 10; ++i) setTimeout(function () { console.log(i); }, 9); // 10,10,10,10,10,10,10,10,10,10