Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.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 一些Greasemonkey脚本顶部的这一行是什么?_Javascript_Garbage Collection_Anonymous Function_Iife - Fatal编程技术网

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

Javascript 一些Greasemonkey脚本顶部的这一行是什么?,javascript,garbage-collection,anonymous-function,iife,Javascript,Garbage Collection,Anonymous Function,Iife,背景: 我有一个自学的爱好者对C++的理解水平,这已经转化为对JavaScript的一个类似的理解。为了更好地理解javascript,我决定编写一个Greasemonkey脚本来解决Google如何处理的问题 我写了我的剧本,而且非常简单。现在我觉得这个脚本可能对其他人有用,所以我想发布它。在我这么做之前,我想确定我没有发布不负责任的代码 我知道糟糕的垃圾收集常常被认为是扩展的一个问题,我做了一些研究,了解我需要在javascript中做些什么来防止这种情况。答案似乎是,当函数退出时,封装在函

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

我写了我的剧本,而且非常简单。现在我觉得这个脚本可能对其他人有用,所以我想发布它。在我这么做之前,我想确定我没有发布不负责任的代码

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

这就引出了这些问题:

  • 我应该如何使用我的基本javascript函数来确保它不会泄漏内存
  • 这是我在许多剧本中看到的答案吗:

    (function(){  
        //code goes here    
    })();
    
  • 在上面的代码中,第一个括号的用途是什么?这对我来说似乎是多余的

  • 当我试图理解这句话时,我把它改写为:

    (function main(){  
        //code goes here  
    })   
    main();  
    
  • 其想法是,这只是调用以前未命名的函数。但这不起作用,为什么

    我对一般答案更感兴趣,但如果需要,这里是我当前的代码:

    这个问题已经有很多答案了。。。这是一个自动执行的函数。在许多情况下,它用于保护您的代码不受全局范围的影响。它也是以其他方式写的:

    function(){}()
    (function(){})()
    (function(){}())
    !function(){}()
    (function(){}).call(this)
    
    这种模式(将函数包装在一对括号中,然后将另一对放在第一对之后)称为“IInvokedFfunctionExpression”模式(简称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;
    
    至于为什么当你给函数起名字时它不起作用,我建议你仔细阅读,尤其是在他提到的地方。它的缺点是,当您有一个命名函数表达式(而不是一个语句)时,该名称被假定为只对函数的作用域可用

    就三和四而言,就避免内存泄漏而言,iLife并不是一种避免内存泄漏的方法(正如@elclanrs所指出的,它只是帮助您避免污染全球范围)。为了避免内存泄漏,请避免循环引用(请记住,闭包可能是循环引用的来源)


    祝你好运,玩得开心

    以下是一个可以使用匿名函数的示例: 让我们有4个id为的元素:id_1、id_2、id_3。。。 我们希望在它们中的每一个上循环并分配onclick事件

    for (var i=0; i<5; i++) {
        document.getElementById("id_"+i).onclick = function()  {alert(i)}
    }
    

    for(var i=0;Itis与Greasemonkey无关,在那里几乎不需要这样的包装。此外,默认情况下,匿名函数中的Firefox和Chrome包装脚本。可能的副本不是“立即调用的函数表达式”(IIFE)更常见的术语是什么?@BrockAdams-是的-我现在已经修好了。谢谢!
    
    for (var i=0; i<5; i++) {
    (function(n){
        document.getElementById("id_"+n).onclick = function() {alert(n)};
    })(i);