由loadstring函数创建的子函数环境。

为什么调用 f() 和 g() 会得到不同的结果?它们都继承自父函数 run 的环境,但 f() 并不改变 j 的值。

myString = "print('i,j in myString before setting', i, j);\
            i = 'fi'; j ='fj'\
            print('i,j in myString after setting', i,j)"
j = 1
print('j initial value', j)

function run(i)
    i = 'i'
    print('i initial value', i)
    f = loadstring(myString)
    if not f then
        print('load failed')
    else
        print('=== load ok, now execute')
        f()
        print('=== end of execution')
    end
    print('i,j after f()', i,j)

    g = function()
        i = 'gi'; j = 'gj'
    end
    g()
    print('i,j after g()', i,j)
end

run(i)

结果:

j initial value   1
i initial value   i
=== load ok, now execute
i,j in myString before setting   nil   1
i,j in myString after setting fi fj
=== end of execution
i,j after f()  i  fj
i,j after g()  gi gj

请注意,在调用 f() 和 g() 后 i 的值不同。

点赞
用户3979429
用户3979429

你正在引用两个不同的i变量。

当你调用f()时,它访问的是全局变量i,而你在g()中访问的是run的参数i

2015-10-30 23:09:07