在Javascript中,IIFE(立即调用函数表达式,尽管首字母缩写可能会有其他扩展)可以写成:
(function () {
var foo = 'bar'
console.log('hi!');
})();
变量声明foo
不会污染当前范围。如何在Ruby文件中执行相同的操作?
我想在受约束的范围内(带有闭包)创建一些临时变量,并使其稍后在文件中无法被其他代码访问。
好吧,您以相同的方式进行操作:编写一个任意的lambda文字,然后立即调用它。
但是,有一个警告:Ruby没有变量声明。因此,任何在块内使用的变量名(也存在于该块外)均指的是捕获的外部变量,而在ECMAScript中,如果var foo
在函数内声明,则将覆盖外部变量foo
。
如果要在Ruby中实现相同的行为,则必须foo
在块的参数列表中显式声明为块局部变量:
-> (;foo) do
foo = 'bar'
puts 'hi!'
end.()
如果您不这样做,则块内的分配将修改捕获的外部绑定。相比:
foo = 'foo'
-> do
foo = 'bar'
puts 'hi!'
end.()
foo
# => 'bar'
如您所见,外部绑定已修改。
foo = 'foo'
-> (;foo) do
foo = 'bar'
puts 'hi!'
end.()
foo
# => 'foo'
如您所见,只有第二个实际上与ECMAScript版本匹配:
"use strict";
const foo = 'foo';
(() => {
const foo = 'bar';
console.log('hi!');
})()
foo
// => 'foo'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句