Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
写作的好处是什么;功能性;Javascript与OO的对比?_Javascript_Anonymous Function - Fatal编程技术网

写作的好处是什么;功能性;Javascript与OO的对比?

写作的好处是什么;功能性;Javascript与OO的对比?,javascript,anonymous-function,Javascript,Anonymous Function,我经常遇到由许多匿名函数组成的Javascript代码片段,这些匿名函数在创建它们的地方被调用,例如: 因此,这将调用一个匿名函数,该函数返回另一个函数prealloc\u win。对我来说,这似乎相当于实例化一个类,其中结果对象公开函数prealloc\u win: function preallocObj() { // some definitions here this.prealloc_win = function(file, size, perms, sparse

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

因此,这将调用一个匿名函数,该函数返回另一个函数
prealloc\u win
。对我来说,这似乎相当于实例化一个类,其中结果对象公开函数
prealloc\u 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)编写?

< p>你几乎有正确的想法。此模块模式/函数生成器的好处是,生成的函数可以包含自己的内部定义或状态

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

var prealloc = function() {
  // some definitions here
  // function body
}
每次调用此函数时,它都会重新分配/实例化其变量,增加不必要的性能开销,并覆盖以前调用产生的任何状态数据


当存在一些对函数的工作非常重要的变量时,此方法非常有用,您只需要对这些变量进行私有访问,或者需要在调用之间保持这些变量,而不污染外部作用域。

关键在于,
preallocObj
类说这是可以实现的 多次实例化。我可以创建更多的实例,尽管它并不是专门为此而设计的。你可以做一些黑客来防止这种情况发生,但是使用立即调用的匿名函数就更容易了

使用立即创建和调用的匿名函数,创建一个“类”,立即“实例化”并分配给
prealloc

无法引用在此之后创建
prealloc
对象的原始匿名函数。它是被创建、调用和丢失的。

< P>JavaScript与C++、java和Python有很大的不同,应该以不同的方式编写。冒着重复的风险,Javascript不是一种OOP语言,而是一种原型语言。(JSON的发明者)Yahoo有一些精彩的文章,特别是名为“Javascript-好的部分”的视频,你应该全部观看。

这里的
//一些定义将在没有包装的情况下被转储到全局范围内function@Esailija在Javascript的OOP模型中,您不仍然有一个包装函数吗?只有当它被当作一个类使用时……你能举例说明你的意思吗@Esailija我更新了问题,加入了一个例子。我明白了。但是这样做没有任何意义,因为它不会被多次实例化。您只需要使用一次新的preallocObj()
,它并不适合这种方式。
var prealloc = function() {
  // some definitions here
  // function body
}