我经常遇到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)?
答案 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 - 好的部分”的视频你应该全部观看。