javascript匿名函数语法

javascript匿名函数语法,javascript,anonymous-function,Javascript,Anonymous Function,以下两个模块之间的区别是什么 // block 1 { console.log("anonymous block"); } // block 2 (function anon() { console.log("anonymous block 2"); })(); 我在Netbeans中运行了这个程序(使用node.js插件),它们似乎都能工作…不同之处在于,您可以使用后一种形式隐藏全局变量,而不会破坏它们 例如,假设您正在使用jQuery库,默认情况下,jQuery库将其主名

以下两个模块之间的区别是什么

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

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

我在Netbeans中运行了这个程序(使用node.js插件),它们似乎都能工作…

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

例如,假设您正在使用jQuery库,默认情况下,jQuery库将其主名称空间别名为
$
。如果您想在不改变
$
的正常使用方式的情况下,将
$
用于其他用途,可以执行以下操作:

(function($) {
    // Use $ without clashing with the jQuery object.
})(someObject);
事实上,它还有一个用途。由于
undefined
在JavaScript中不是保留字,因此可以给它一个值,从而失去它的用途。因此,您不能简单地将值传递到未定义的参数中,您知道它将正常工作,而不会与全局值发生冲突

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);

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

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"

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

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

var a = 2;
{
    var a = 4;
}
a; // === 4
block 2
将具有全局作用域,但由
var
设置的任何内容在执行后都将被遗忘

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

Javascript闭包在函数/脚本上,而不是在块上。@jholloman-我想这就是shhac所说的-块不定义独立的作用域。是的,如果您使用Javascript 1.7中的
let
,它只会给出作用域。此外,它还可以在模块模式中使用。(请参阅)最酷的是,您甚至可以引用私有变量。例如,在您的
方法中
,您可以增加对全局范围不可见的计数器,并将其用作可靠的方法来跟踪方法被调用的次数。