为什么许多JavaScript库是这样的:?为什么许多JavaScript库首先“(函数(){”
(function() {
/* code goes here */
})();
这似乎定义一个匿名函数被立即调用为什么要通过这一点。 ?努力
为什么许多JavaScript库是这样的:?为什么许多JavaScript库首先“(函数(){”
(function() {
/* code goes here */
})();
这似乎定义一个匿名函数被立即调用为什么要通过这一点。 ?努力
这是在JavaScript中执行命名空间的标准方法。如果您只声明
var my_cool_variable = 5;
它将是全局的,并可能与其他使用相同变量的库冲突。
但是,如果你这样做
(function() {
var my_cool_variable = 5;
})();
现在是匿名函数的局部变量,而不是该函数的范围之外不可见。您仍然可以通过在变量前面没有声明var
来公开可访问的API,这样它将是全局的,但现在您可以选择。
在一个简单的层面它使全局命名空间干净(ER)
即:它有效地将缠绕在库中的函数和变量,从而确保一层不会有任何命名空间冲突与其他可能的功能从其他图书馆使用等。
如果强制范围声明。通过将它放入一个函数中,您可以确保您创建和调用的变量不会被重新声明,也不会意外地调用其他地方声明的变量。
所以.....
var variable = 5; // this is accessible to everything in the page where:
function()
{
var variable = 7 // this is only available to code inside the function.
}
这里是道格拉斯Crockford的网站的链接的Javascript谈论范围:
http://javascript.crockford.com/code.html
跟进下面的评论:
JavaScript的范围有点“破”:
function()
{
var x = 3; // accessible in the entire function.
//for scope reasons, it's better to put var y = 8 here.....
if(x != 4)
{
var y = 8; //still accessible in the entire function.
//In other languages this wouldn't be accessible outside
//of the if statement, but in JavaScript it is.
}
}
,因为JavaScript有功能范围,但没有阻止范围。 :D – 2009-12-24 14:00:03
你认为这是坏的? W3C关于变量作用域的想法如何:考虑到这个例子,如果在'if(x!= 4){..}'块中'x'的值被改变了,那么这个改变将会出现在这个块内部,但不在它之外之后也没有。 – Esko 2009-12-25 13:58:38
JavaScript没有块范围,只有函数范围。通过创建并立即调用匿名函数,我们可以保证其局部变量不会遍布全局名称空间。这基本上是一种限制与其他图书馆冲突的方法。
var $={} // a name space is defined
(function($) {
$.a_variable="some vale"
var b_variable = "some more value";
})($);
$.a_variable // acess it like this.
现在匿名函数内部任何事物都有范围等于函数只 我们也可以创建可作为性能我们的名字空间行动的对象。
很确定这是一个重复的.... – 2009-12-24 13:58:08