似乎在C语言、Java语言和露比语言中(相对于JavaScript),为循环块的每个迭代创建了一个新的范围,并且为循环定义的局部变量实际上是每一次都变成一个局部变量,并记录在这个新的范围内。
例如,在Ruby中:
p RUBY_VERSION
$foo = []
(1..5).each do |i|
$foo[i] = lambda { p i }
end
(1..5).each do |j|
$foo[j].call()
end
打印输出为:
[MacBook01:~] $ ruby scope.rb
"1.8.6"
1
2
3
4
5
[MacBook01:~] $
因此,当创建新的作用域时,它看起来像
i
也会在这个新的作用域中创建和记录,以便在稍后执行函数时,在这些作用域链中分别发现“i”为1、2、3、4、5。这是真的吗?(这听起来像是一次沉重的手术)。
把它和
p RUBY_VERSION
$foo = []
i = 0
(1..5).each do |i|
$foo[i] = lambda { p i }
end
(1..5).each do |j|
$foo[j].call()
end
这次,
我
是在进入循环之前定义的,因此Ruby1.8.6不会将此
我
在为循环块创建的新作用域中,因此当
我
在范围链中查找,它始终引用
我
这是在外部范围内的,每次给出5个:
[MacBook01:~] $ ruby scope2.rb
"1.8.6"
5
5
5
5
5
[MacBook01:~] $
我在Ruby1.9中听说,
我
将被视为循环的本地定义,即使存在
我
之前定义的?
创建新作用域、创建新的本地副本的操作。
我
循环中的每一次似乎都很重,因为如果我们以后不调用函数似乎就没有关系了。因此,当以后不需要调用函数时,解释器和编译器可以对C/Java进行优化,以使其没有本地副本。
我
每一次?