“(function(){”在脚本开头的目的(仅限GreaseMonkey?)

时间:2010-12-19 06:18:12

标签: javascript function greasemonkey

我是JavaScript的新手,我正在自学。我目前正在创建和调整GreaseMonkey脚本。我注意到大多数简单的脚本(即那些不需要命名函数的脚本)直接进入主代码,但是有些脚本设置如下:

(function() {  
    //main code here  
})();

这种编码有什么意义?我已经注释掉了顶部和底部,脚本仍然运行完全相同。

它只是一个编码标准,还是它实际上有一个功能?并且,正如我的标题所问,GreaseMonkey是特定的东西,还是我应该一直做的事情?

4 个答案:

答案 0 :(得分:8)

此技术有效地创建了一个私有命名空间,只能由此脚本访问。例如,此代码:

(function() {
    var a = 5;
})();

对全局命名空间无效(闭包捕获a变量,因此window.a不会受到影响。这是一种非常好的方法,可以让许多脚本不会踩到彼此的全局变量,使它们根本不是全局变量。我在编写任何JavaScript时都会使用这种技术,而不仅仅是Greasemonkey脚本,并强烈建议在编写库时将其作为最佳实践。

如果您想将某些函数公开给其他JavaScript代码而不是完全隔离您的脚本,您可以这样做:

var MyNamespace = (function () {
    var that = {};

    that.square = function(x) {
        return x*x;
    };

    return that;
})();

然后你可以从另一个脚本做MyNamespace.square(5),这将返回25。

答案 1 :(得分:3)

这是一个自动执行匿名函数。

它通常用于更改范围,在此范围内声明的所有变量/函数将位于匿名函数的范围内,而不是全局(窗口)范围。

答案 2 :(得分:2)

该代码有两个目的:

  1. 它将对象/变量保持为匿名函数范围的本地。这很重要,因为我们发现您可能有多个脚本文件,这些脚本文件可能共享相同的变量名称。如果他们这样做了,他们可以替换变量值并真正破坏您的应用程序。

  2. 该行末尾的()调用声明的函数。换句话说,您在第一组括号内创建的匿名函数可以立即自动调用。除非您将其分配给变量,否则没有其他方法可以调用它。这样可以避免在内存中创建变量,只是在运行时调用该函数。

答案 3 :(得分:0)

以下是那些从未听过关闭一词的人的答案:

假设我们有一个功能

function sayHi() { alert('Hello'); }

我们会通过这样做来调用此函数:

sayHi();

以上是什么称为命名函数,如果您不知道这意味着什么,那么当您听到单词函数时,您会想到这一点

在某些语言中,您不必为某个功能命名,您可以将其留空,如下所示:

alert('Sup');
function() {alert('Hello'); }
3 + 1;
alert('Peace');

第2行完全有效。当然,第2行不会在你的页面中真正做任何事情,就像第3行没有做任何事情一样。这被称为匿名函数。现在就像我们可以将变量分配给第3行,如:

result = 3 + 1;

我们可以对第2行做同样的事情,如下所示:

myFunc = function() { alert('Hello'); };

我们之前可以使用myFunc作为sayHi()函数之类的函数。我们称之为就像我们称之为sayHi()

sayHi();
myFunc();

既然javascript被编写为多功能的,[0,1,2] .indexOf(1)这样的东西可以工作,我们可以做到以下几点:

func = function() { alert('hello'); };
func();
(function() { alert('hello'); })();

第1行& 2将完成与第3行相同的操作,因为第3行只是第1行和第2行的扩展版本。第3行的优点是,如果稍后代码中的某个人使用了func变量,则不会导致问题自己的代码,在第3行的函数中声明的任何变量(使用var关键字)都不会是函数之外的有效变量,在这种情况下就是闭包。

这就是这个微型教程,希望它有所帮助。