【问题标题】:javascript anonymous function syntaxjavascript匿名函数语法
【发布时间】:2012-09-08 04:54:20
【问题描述】:

以下两块有什么区别?

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

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

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

【问题讨论】:

    标签: javascript anonymous-function


    【解决方案1】:

    不同的是,你可以使用后一种形式隐藏全局变量而不破坏它们。

    例如,假设您正在使用 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);
    

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 很酷的是你甚至可以引用私有变量。例如,在您的method 中,您可以增加一个对全局范围不可见的计数器,并将其用作一种可靠 的方式来跟踪该方法被调用了多少次。
    【解决方案3】:

    block 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 developer.mozilla.org/en-US/docs/JavaScript/Reference/… 时,它才会提供范围
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多