一些Greasemonkey脚本顶部的这一行是什么?

Dal*_*son 7 javascript garbage-collection anonymous-function iife

背景: 我有一个自学成才的爱好者对C++的理解水平,已经转化为对javascript的类似理解.为了更好地理解javascript,我决定编写一个Greasemonkey脚本来解决Google如何处理来自同一域的多个结果的问题.

我写了我的剧本,这简直太容易了.现在我觉得这个脚本对其他人有用,所以我想发布它.在我这样做之前,我想确定我不会发布不负责任的代码.

我知道糟糕的垃圾收集通常被认为是扩展的问题,并做了一些研究,我需要在javascript中做什么来防止这种情况.似乎答案是当函数退出时,函数中包含的任何内存都将被回收.这似乎解释了为什么我看到的一些流行脚本被包含在一个无用的功能中.

这引出了我这些问题:

  1. 我应该怎么做我的基本javascript函数,以确保它不会泄漏内存?
  2. 这是我在许多脚本中看到的答案:

    (function(){  
        //code goes here    
    })();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在上面的代码中,第一个括号的目的是什么?这对我来说似乎是多余的.

  4. 当我试图理解这一行时,我把它重写为:

    (function main(){  
        //code goes here  
    })   
    main();  
    
    Run Code Online (Sandbox Code Playgroud)

这个想法是,这只是调用以前未命名的功能.这不起作用,为什么?

我对一般答案更感兴趣,但如果需要这里是我目前的代码:http: //pastebin.com/qQWKfnJT

Sea*_*ira 9

该图案(在一对括号的包装的功能,然后放置另一对第一对之后)被称为" mmediately nvoked ˚FÈ XPRESSION"图案(IIFE的简称).它的作用是定义一个匿名函数,然后立即执行它.第一组括号将函数标记为表达式,而不是语句.第二个集合执行从第一个表达式返回的函数:

// This:
(function(){
    // Todo: Add code
})();

// Translates *approximately* to this:
var _anonymous_function_2723113 = function() {
    // Todo: Add code
};
_anonymous_function_2723113();
delete _anonymous_function_2723113;
Run Code Online (Sandbox Code Playgroud)

至于为什么函数在你给它命名时不起作用,我建议你阅读kangaxx关于这个主题的文章,特别是在他触及Named Function Expressions的地方.缺点是当你有一个命名函数表达式(而不是一个语句)时,该名称应该只对函数的作用域可用.

对于三个和四个这么多 - 至于避免内存泄漏,IIFE不是一种避免内存泄漏的方法(正如@elclanrs指出的那样,它只是帮助你避免污染全局范围).为避免内存泄漏,请避免使用循环引用(请记住,闭包可以是循环引用的来源).

祝你好运,享受自己!