如何用Ruby编写IIFE?

马克斯·华莱士

在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章