JavaScript匿名函数语法

3
以下两个块之间有什么区别?
// block 1
{
    console.log("anonymous block");
}

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

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

3个回答

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

此外,它还可以用于模块模式中。(请参阅https://dev59.com/oGjWa4cB1Zd3GeqPoTM5#12325201) - Platinum Azure

3

首先,创建一个块(block)与创建一个函数并不相同。您可以使用匿名的自执行函数来创建本地的、私有的变量,并从中返回一个接口。这被称为模块模式(Module Pattern)。

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面向对象编程中最重要、最有用的功能之一。


很酷的是,你甚至可以引用私有变量。例如,在你的“方法”中,你可以增加一个计数器,它在全局范围内不可见,并将其用作可靠的方式来跟踪该方法被调用的次数。 - Platinum Azure

0

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

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

block 2将具有全局作用域,但由var设置的任何内容在执行后都将被遗忘。

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

Javascript闭包是在函数/脚本上而不是块级作用域上。 - jholloman
@jholloman - 我认为shhac的意思是,一个代码块并不定义独立的作用域。 - Ted Hopp
是的,只有在使用JavaScript 1.7中的let时才会给出作用域 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let - Paul S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接