编写“功能”Javascript而不是OO有什么好处?

时间:2012-07-15 15:48:37

标签: javascript anonymous-function

我经常遇到Javascript代码片段,其中包含许多在创建它们时调用的匿名函数,例如here

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)?

3 个答案:

答案 0 :(得分:1)

你几乎有正确的想法。此模块模式/功能构建器的好处是,结果函数可以包含其自己的内部定义或状态。

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

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

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

如果某些变量对于您希望仅进行私有访问的函数的工作很重要,或者您需要在调用之间保留而不会污染外部范围,则此方法非常有用。

答案 1 :(得分:1)

这笔交易是preallocObj课程说这可能是这样的 实例化多次。我可以创建更多的实例,即使它不是真的为此而设计的。你可以做一些黑客来防止这种情况,但为此更容易使用立即调用的匿名函数。

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

答案 2 :(得分:0)

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