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