我有一个与单行编程有关的简单问题。首先是一个例子:

function test(a)
{
   var b=a.toString();
   return b.replace("a","b");
}
这很简单(该函数当然是没有用的),但是这里的问题稍微复杂一些:如果我要一行完成该操作怎么办?我有我的想法,但请告诉我这在内存清理方面是否可以正常工作:
function test(a)
{
   return (arguments[1]=a.toString()).doSomething().doSomethingMore(arguments[1]);
}
当然,这是一个示例,但是想法很简单:将参数用作局部变量的容器-我不确定,但是据我所知,当函数结束时,参数也被删除了吗?还是在参数中创建新元素使该元素全局定义?从我的测试看来,我是正确的,但我很好奇是否有人尝试过?这是一个安全,干净的解决方案吗?:)谢谢您的评论。
这是单行脚本问题中的一个更实际的问题:
function (number,limiter)
{
return ((arguments[2] = number.toString().replace(
         new RegExp("(\\d+)(\\d{3})($|"+limiter+")"),
         '$1'+limiter+'$2$3')) == number) ?
            arguments[2] :
            arguments.callee(arguments[2],limiter);
}
这一行函数使用给定的字符串执行操作,然后将其返回或递归解析到同一函数。 (在其他线程上,我演示了如何无需递归即可完成此操作,但这不是问题所在)。

最佳答案

您的示例可能会使一个简单的操作过于复杂,但是您正在演示的技术称为“链接”方法。这是一种非常有效的形式,在不需要或有意义的中间结果时,实际上可以用来使代码更具可读性。

我目前最喜欢的示例是美妙的DateJs:

var nextTuesday = DateJs.today().next().tuesday();

var aBitLater = DateJs.now().addHours(1).addMinutes(30);

当然,它是语法糖,可以作为单独的语句更详细地编写,但是使用仔细的方法命名,您实际上可以使它读起来像英语。

GC /内存管理不受此样式的影响,函数的参数与其他任何参数一样被清除。实际上,这实际上可能更安全,因为在函数调用返回后参数立即超出范围,并且无需为将值传递给下一个函数调用而创建值的局部变量。

您的示例可能有些人为,但是如果您在有意义的地方使用它,则这是一个有用的模式。

关于javascript - Javascript局部变数技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/473181/

10-08 23:32