带()的Javascript语法 - 函数范围

时间:2010-06-09 16:45:02

标签: javascript

  

可能重复:
  JavaScript scope and closure

我对Javascript语法不是很熟悉。任何人都可以掩饰这块的意义吗?出于什么目的?

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

提前致谢。

4 个答案:

答案 0 :(得分: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');
})();

答案 1 :(得分: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 :(得分:0)

Javascript允许您动态声明函数 - 它们被称为闭包 - 并且在您的示例中在第一组括号之间完成。当您引入第二组括号时,您将调用刚才定义的函数。需要注意的区别是函数声明/定义与该函数的应用之间的区别。

答案 3 :(得分:0)

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

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