脚本开头“(function() {”的用途(仅限 GreaseMonkey?)

问题描述 投票:0回答:4

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

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

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

它只是一个编码标准,还是真的有功能?而且,正如我的标题所问的,这是 GreaseMonkey 特有的事情,还是我应该一直做的事情?

javascript function greasemonkey
4个回答
10
投票

此技术有效地创建了一个私有名称空间,仅可由该脚本访问。例如这段代码:

(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。


3
投票

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

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


2
投票

该代码有两个用途:

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

  2. 行尾的

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


1
投票

这里有一个针对那些从未听说过闭包的人的微型教程:

假设我们有一个函数

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'); };

并且我们可以像之前的 sayHi() 函数一样使用 myFunc 作为函数。我们调用它就像调用 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 关键字)都不会是函数外部的有效变量,在本例中这就是闭包。

© www.soinside.com 2019 - 2024. All rights reserved.