为什么这两个看似相同的代码片段在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()
Run Code Online (Sandbox Code Playgroud)
使用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()
Run Code Online (Sandbox Code Playgroud)
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 …
Run Code Online (Sandbox Code Playgroud) 我的理解是,当您使用 编译 C 代码时gcc -g
,gcc 将插入调试信息,其中包括对原始源代码的引用(例如行号)。然后其他程序如 gdb 和 objdump 可以稍后恢复这些引用。作为示例,我们将使用objdump -S
which 打印与相应源代码交错的程序集。
我的目标是将编译后的二进制文件复制到另一台计算机,并且仍然能够检索此调试信息。但是,目前,当我这样做时,所有调试信息都丢失了。我也不介意复制源文件,但是第二台计算机运行的是不同的操作系统,所以文件结构不同,我不能将源文件放在完全相同的绝对位置,这会阻止 objdump 找到源代码。我查看了二进制文件,看到了一个看起来像这样的部分,中间穿插着一堆二进制文件:
/home/path/to/source/code
我尝试编辑它以匹配源的新路径,但它只是使二进制文件无效。
我还研究了gcc 标志,希望其中一个允许指定源代码的相对路径而不是绝对路径,但我找不到类似的东西。
作为参考,这是我希望从中获得的输出类型objdump - S
:
0804840b <main>:
#include <stdio.h>
int main(){
804840b: 8d 4c 24 04 lea 0x4(%esp),%ecx
804840f: 83 e4 f0 and $0xfffffff0,%esp
8048412: ff 71 fc pushl -0x4(%ecx)
8048415: 55 push %ebp
8048416: 89 e5 mov %esp,%ebp
8048418: 51 push %ecx
8048419: 83 ec 14 sub $0x14,%esp
for(int varName = 0; varName < …
Run Code Online (Sandbox Code Playgroud)