2010-06-09 39 views
1

可能重复:
JavaScript scope and closure有()JavaScript语法 - 功能范围

我不是很熟悉JavaScript语法波纹管。任何人都可以为这个街区的感觉遮光吗?出于什么目的?

 
(function foo() { 
    alert('bar'); 
})(); 

在此先感谢。

+0

http://stackoverflow.com/questions/2897987/why-would-one-write-global-code-inside-a-function-definition-call-pair – nico 2010-06-09 16:47:47

+0

和另一个HTTP和:// stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript – Anurag 2010-06-09 16:49:38

+0

他的问题与那些不同,因为他在他的封闭功能上有一个名字,创造了一个完整的不同的问题集(尽管他可能会也可能没有这样的意思) – 2010-06-09 16:54:24

回答

0

Javascript允许您即时声明函数 - 它们被称为闭包 - 并在第一组圆括号之间的示例中完成。当你引入第二组括号时,你就调用了你刚刚定义的那个函数。注意的区别在于函数声明/定义和该函数的应用之间的区别。

1

其目的是将您正在进行的工作的范围从全局范围移除。这有助于封装对象并防止污染全局池。您全局声明,就包含函数foo()的任何变量将不可用,除了给函数foo()内声明的函数

var GLOBALVAR //this is available to the global document scope 
(function foo() { 
    var FOOVAR //only available within this function 
    function bar(){ 
     FOOVAR = GLOBALVAR //this will work 
    } 
    alert('bar'); 
})(); 
FOOVAR = GLOBALVAR //This will not because FOOVAR is out of scope 
2

这看起来像不好的做法,我(命名闭合功能),因为它可以导致浏览器不一致。

看看下面的代码,例如

(function foo() { 
    alert('bar'); 
})(); 
foo(); 

在Internet Explorer中,您将获得2级警报,因为它实际上创造了功能作为一个名为foo全局函数。

在Chrome中,它只会提醒一次,foo没有全局声明,所以你得到一个JavaScript错误foo is not defined

通常你会不会来一个闭合功能

(function() { // notice you don't see foo anymore 
    alert('bar'); 
})(); 
+0

我并不知道命名闭包函数的问题。不是我曾经这样做过,但很高兴知道。 – 2010-06-09 16:58:06

0
起名(){

var tokenizer =(function(){ var id = 0; return function(){ return id ++; }; })();

tokenizer(); // 0 
tokenizer(); // 1 
tokenizer(); // 2 
alert(id); // undefined