javascript匿名函数语法

时间:2012-09-07 20:45:03

标签: javascript anonymous-function

以下两个区块有什么区别?

// block 1
{
    console.log("anonymous block");
}

// block 2
(function anon() {
    console.log("anonymous block 2");
})();

我在Netbeans中运行它(使用node.js插件),它们似乎都工作...

3 个答案:

答案 0 :(得分:6)

不同之处在于您可以使用后一种形式隐藏全局变量而不会破坏它们。

例如,假设您正在使用jQuery库,默认情况下将其主命名空间别名为$。如果您希望将$用于其他目的而不更改通常使用$的方式,则可以执行以下操作:

(function($) {
    // Use $ without clashing with the jQuery object.
})(someObject);

事实上,它对另一个目的也很有用。由于undefined不是JavaScript中的保留字,因此可以赋予它一个值并失去其目的。因此,您可以简单地将值传递给undefined参数,并且您知道它将在不与全局值冲突的情况下正常运行。

undefined = "some not-undefined value";    // you'd have to be an idiot to do this but I've seen it done
(function(a, b, undefined) {
    console.log(typeof(undefined) === "undefined");   // true
})(someA, someB);

答案 1 :(得分:3)

第一个创建一个块,它与一个函数不同。您可以使用匿名自执行函数来创建本地,私有变量并从中返回接口。它被称为模块模式。

var Module = (function() {

    var method = function() { console.log("anonymous block"); },
        someOtherMethod = function() {};

    return { // return our interface as an object literal
        method: method,
        someOtherMethod: someOtherMethod
    };
})();

Module.method(); // "anonymous block"

我们可以调用它,保持变量methodsomeOtherMethod与全局范围隔离。它是JS中面向对象编程最重要,最有用的特性之一。

答案 2 :(得分:0)

block 1将具有其所在块的范围,设置var将在父级中覆盖它,您可以使用let

var a = 2;
{
    var a = 4;
}
a; // === 4

block 2将具有全局范围,但var设置的任何内容在执行后都会被遗忘。

var a = 2;
(function(){
    var a = 4;
})();
a; // === 2