【问题标题】:What is the deal with returning empty functions for modularity?为模块化返回空函数是怎么回事?
【发布时间】:2013-10-09 10:21:38
【问题描述】:

越来越多的javascript 采用这种模块化方法返回空函数。您可以在node.js 的源代码中找到它。它在require.js 的文档中。它有什么作用?

define(['jquery'] , function ($) {
    return function() {};
});

如果我要返回一个对象,我只会做return {};,尽管我认为返回一个空对象没有用。可能想把变量放进去。因此,这显然是有价值的。我猜它与访问返回函数范围内的函数有关。

AMD Is Not The Answer 文章中的构造又是这样的:

define(['dep1', 'dep2'], function (dep1, dep2) {
    //Define the module value by returning a value.
    return function () {};
});

但是上面的实际好处是什么,而不是仅仅返回你想要返回的语义上有意义的东西,例如在一个对象中?

你如何以这种方式访问​​外部功能范围内的东西?

function(baz) {
    var foo = true,
        bar = false;

    if (baz) bar = true;

    return function() {}; // wut?
};

虽然我在技术上并不完全“受到挑战”,但我希望有人能用外行的方式解释这一点,因为articles about modularity 不会让我开心。

【问题讨论】:

  • 也许意图是返回一个空的构造函数?返回的函数可以访问定义它的范围内的变量;但既然没有,我相信这只是一个愚蠢的例子。
  • 我认为这是一种避免错误的方法,所以在这种情况下,如果没有另外定义 jQuery,jQuery(whatever) 将简单地失败。这个策略是有问题的,当然需要一些背景来解释为什么要使用它。

标签: javascript function object constructor modularity


【解决方案1】:

您的代码有误。它应该是这样的自执行函数:

(function(baz) {
    var foo = true,
        bar = false;

    if (baz) bar = true;

    return function() {}; // wut?
});

所以你只是忘记了前面的(。 现在你可能会将它用作表达式,所以它会变成这样

var singleton = (function(baz) {
    var foo = true,
        bar = false;

    if (baz) bar = true;

    return function() {}; // wut?
});

现在您的单例变量将是一个简单的空函数。

如果你输入

return function() {
  return foo; 
}

它变得很有用: singleton()

和你刚才写的模块模式非常相似:

return {
  myFoo: foo
}

因此您可以使用singleton.myFoo 访问它;

这对于实现 public/private 变量很有用,因此您只需返回要公开的 函数/变量

【讨论】:

  • 你可能指的是 IEFE,然后你忘了调用你的匿名函数。 (function () { ... })();。否则singleton() 将返回内部函数,而不是true。另外,我无法理解singleton 如何在代码中的任何位置变成{}
  • 另外,模块模式的重点是返回的函数可以访问通过闭包创建它的执行上下文。返回一个空函数会保留闭包,但不使用它们,这是毫无意义的。
  • @RobG 我已编辑。不是空对象,而是空函数。我的坏
  • 您能否详细说明一下为什么要使用return function() { return foo;} 而不是return foo; 的非自执行功能?两者都返回 true。
  • @Redsandro 不同之处在于,如果您返回函数,则必须调用它。当您想要构造一个新函数同时保留传递的参数(在这种情况下为 IEFE)时,返回函数很有用,因此您可以生成很多新函数
猜你喜欢
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多