为什么要为匿名函数分配变量,然后在该函数中重新定义它?

时间:2019-01-19 23:31:58

标签: javascript

我一直在努力提高JavaScript技能,并且我已经知道将脚本包装在匿名函数中的好处是可以使它自调用,并使变量和内部函数保持私有。

但是,将匿名函数分配给变量,然后在该函数内部再次将与空对象相同的变量,这有什么意义呢?是要清除吗?

最后,函数return的作用是什么?

var app = (function () {
    'use strict';

    var app = {};

    //more code

    return app;
})();

2 个答案:

答案 0 :(得分:2)

如前所述,您使用此语法创建了一个闭包,因此您可以将变量保持私有和公开状态,并将Interface保留为API,那么为什么要在闭包中返回并清空或填充对象呢?这是一种公共方法可以使用,这有助于避免API与外部API(库)之间的上下文冲突。

var api = (function(jqueryRef){
                   var $ = {
                      addClass: jqueryRef.addClass,
                      yourOwnAddClassFn: ...
                    };
                    return $;
                 })($);

如您所见,您可以将jquery引用作为参数传递,并可以在闭包中使用它,然后可以将$通用jquery命名空间用于API,而不会发生冲突。

答案 1 :(得分:0)

您要寻找的被称为scope。看一下来自scotch.io的示例:

// global scope (scopeA)
var Module = (function() {
    // scope is now everything in this function (scopeB)
    function privateMethod() {
        console.log('privateMethod called!')
    }

    return {
        publicMethod: function() {
            // this function has access to scopeB 
            console.log('publicMethod called!');
            privateMethod();
        }
    };
})();


Module.publicMethod(); // gives publicMethod called!
Module.privateMethod(); // Uncaught ReferenceError: privateMethod is not defined

苏格兰威士忌对此的解释实际上是非常好的,所以我只引用它:

  

模块的return语句包含我们的公共函数。私有函数就是那些不返回的函数。不返回函数会使它们在Module名称空间之外不可访问。但是我们的公共功能可以访问我们的私有功能,这使它们可以方便地用于帮助程序功能,AJAX调用等。

我希望这可以为您清除一切。