1

我经常遇到由许多匿名函数组成的 Javascript 代码片段,这些函数在它们被创建的地方被调用,例如

var prealloc = (function() {
    // some definitions here

    return function prealloc_win(file, size, perms, sparseOk) {
        // function body
    };
})();
// can be called like this:
prealloc(...);

所以这调用了一个匿名函数,该函数返回另一个函数prealloc_win。对我来说,这似乎等同于实例化一个类,其中结果对象公开函数prealloc_win

function preallocObj() { 
    // some definitions here  
    this.prealloc_win = function(file, size, perms, sparseOk) {
        // function body
    }; 
}
prealloc = new preallocObj();
// can be called like this:
prealloc.prealloc_win(...);

这个假设正确吗?使用直接调用的匿名函数有什么好处?为什么这个成语在 Javascript 中如此常见,但在其他可以以相同方式编写的语言(C、C++、Python)中却不常见?

4

3 回答 3

1

你几乎有正确的想法。这个模块模式/函数构建器的好处是生成的函数可以包含它自己的内部定义或状态。

它基本上只是一种使用私有变量或常量创建函数的方法。考虑效率较低的替代方案:

var prealloc = function() {
  // some definitions here
  // function body
}

每次调用此函数时,它都会重新分配/实例化其变量,增加不必要的性能开销并覆盖先前调用产生的任何状态数据。

当存在一些对函数的工作很重要的变量时,此方法很有用,您只希望对其进行私有访问,或者您需要在调用之间保留而不污染外部范围。

于 2012-07-15T15:57:39.687 回答
1

交易是preallocObj该类说这是可以多次实例化的东西。我可以创建更多它的实例,即使它并不是真的为此而设计的。您可以采取一些技巧来防止这种情况发生,但为此使用立即调用的匿名函数会更容易。

使用立即创建和调用的匿名函数,会创建一个“类”,立即“实例化”并分配给它,prealloc并且无法引用在prealloc此之后创建对象的原始匿名函数。它被创建、调用和丢失。

于 2012-07-15T19:29:05.847 回答
0

Javascript 从根本上与 C++、JAVA 和 Python 非常不同,应该以不同的方式编写。冒着重复的风险,Javascript 不是 OOP 语言,它是原型语言。 雅虎的Douglas Crockford(JSON 的发明者)有一些精彩的文章和特别是题为“Javascript - 好的部分”的视频,您应该全部观看。

于 2012-07-22T15:56:25.233 回答