我是JavaScript的新手,我正在自学。我目前正在创建和调整GreaseMonkey脚本。我注意到大多数简单的脚本(即那些不需要命名函数的脚本)直接进入主代码,但是有些脚本设置如下:
(function() {
//main code here
})();
这种编码有什么意义?我已经注释掉了顶部和底部,脚本仍然运行完全相同。
它只是一个编码标准,还是它实际上有一个功能?并且,正如我的标题所问,GreaseMonkey是特定的东西,还是我应该一直做的事情?
答案 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)
该代码有两个目的:
它将对象/变量保持为匿名函数范围的本地。这很重要,因为我们发现您可能有多个脚本文件,这些脚本文件可能共享相同的变量名称。如果他们这样做了,他们可以替换变量值并真正破坏您的应用程序。
该行末尾的()
调用声明的函数。换句话说,您在第一组括号内创建的匿名函数可以立即自动调用。除非您将其分配给变量,否则没有其他方法可以调用它。这样可以避免在内存中创建变量,只是在运行时调用该函数。
答案 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关键字)都不会是函数之外的有效变量,在这种情况下就是闭包。
这就是这个微型教程,希望它有所帮助。